【问题标题】:Spring with XML - Return Elements outside of a ListSpring with XML - 返回列表外的元素
【发布时间】:2020-10-30 18:10:51
【问题描述】:

我正在开发一个系统,规范规定通过 Web 服务控制器端点传输的实体 XML 必须是这样的:

<SAAF>
    <vehicle>
        <Information>
            <Quantity>3</Quantity>  
        </Information>
        <Entry>
            [... entry variables ..]
        </Entry>
        <Entry>
            [... entry variables ..]
        </Entry>
        <Entry>
            [... entry variables ..]
        </Entry>
    </vehicle>    
</SAAF>

但是,我只能做到这一点:

<SAAF>
  <vehicle>
    <information>
      <quantity>3</quantity>
    </information>
    <entries>
        <entry>
            [...entry variables...]
        </entry>
        <entry>
            [...entry variables...]
        </entry>
        <entry>
            [...entry variables...]
        </entry>
    </entries>
  </vehicle>
</SAAF>

这是 VehicleRoot 类:

import lombok.Data;

@Data
@XmlRootElement(name = "vehicle")
@XmlType(propOrder = { "Information", "Entries" })
public class VehicleRoot implements Serializable {
    
    private static final long serialVersionUID = 1L;

    private Information Information;

    private List<Entry> Entries;

}

1 - 是否可以发送&lt;Entry&gt;&lt;/Entry&gt; 对象标签而不将它们包装在“条目”列表中?

2 - 我可以配置 Spring 以返回带有大写名称的标签吗? “进入”而不是“进入”?这甚至可能吗? 我通过在 VehicleRoot 类中添加 @JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class) 注释来做到这一点

我希望能够更改系统规范,但我担心我无法做到......

【问题讨论】:

    标签: xml spring spring-boot


    【解决方案1】:

    本案解决方案的更新答案:

    只需为所需的 List 创建一个 getter,并在其上方添加 @JacksonXmlElementWrapper(useWrapping = false) 注释:

    private List<Entry> Entries = new ArrayList<>();
    
    @JacksonXmlElementWrapper(useWrapping = false)
    public List<Entry> getEntries() {
        return this.Entries;
    }
    

    原始答案:

    Jackson 的 XmlMapper 有 a special feature 来启用或禁用 xml 列表的包装。

    @Bean
    ObjectMapper xmlMapper() {
        return XmlMapper.builder()
            ...
            .defaultUseWrapper(false)
            ...
            .build();
    }
    

    如果你使用默认的(自动配置的)xmlMapper,你可以添加Jackson2ObjectMapperBuilderCustomizer,设置相同:

    @Bean
    Jackson2ObjectMapperBuilderCustomizer xmlWrapperCustomizer() {
        return mapperBuilder -> mapperBuilder.defaultUseWrapper(false);
    }
    

    【讨论】:

    • 感谢您的回复。但是,在添加第二个 bean 之后,我收到“应用程序上下文中某些 bean 的依赖关系形成一个循环”并且应用程序没有启动。我应该做点别的吗?
    • 看起来像一个单独的问题...可以在没有定制器 bean 的情况下启动应用程序吗?
    • 是的,它可以在没有定制器 bean 的情况下启动。但是,我设法通过在返回条目的手动输入的 getter“public List getEntries()”上方使用“@JacksonXmlElementWrapper(useWrapping = false)”注释来解开列表。请更新您的答案并添加此提示,以便我标记为答案。
    猜你喜欢
    • 2023-03-07
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多