【发布时间】:2017-09-15 09:09:51
【问题描述】:
我正在使用spring 和RestTemplate 到postForEntity(req, rsp) xml 到网络服务。
@Bean
public Jackson2ObjectMapperBuilderCustomizer initJackson() {
return (builder) -> builder.modules(new JaxbAnnotationModule());
}
java bean 是使用xsdtojava 从xsd 文件自动生成的。因此我无法修改生成的类!
问题:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Generated
public class MyRequest {
@XmlElement(required = true)
private SubReq subs;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public static class SubReq {
private List<String> list;
}
}
结果:<list> 元素包含额外的嵌套 <list> 元素。但为什么?又该如何预防?
当前:
<MyRequest>
<SubReq>
<list>
<list>val1</list>
<list>val2</list>
</list>
</SubReq>
</MyRequest>
我的目标:
<MyRequest>
<SubReq>
<list>val1</list>
<list>val2</list>
</SubReq>
</MyRequest>
如何配置杰克逊不将列表包装在里面?
MyRequest 元素是从以下位置自动生成的:
<xs:schema>
<xs:element name="MyRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="SubReq">
<xs:complexType>
<xs:sequence>
<xs:element name="list" minOccurs="0" maxOccurs="unbounded">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
...
</xs:schema>
【问题讨论】:
-
你试过@JsonUnwrapped 了吗?
-
如前所述,我无法修改自动生成的 java 类。因此,我无法添加任何自定义注释。我必须以某种方式添加一个全局配置来解开任何
List或Map。 -
..也不能修改objectmapper/deserializer属性?
-
Objectmapper 在我的控制之下。那将是可能的。或者更好的是让我们说
builder,例如,我添加注册JaxbAnnotationModule显式告诉杰克逊利用JAXB 属性。
标签: java json xml spring jackson