XSD中的复杂对象集合生成POJO
Collection of complex object in XSD to generate POJO
我必须创建一个 XSD 以便我可以生成一个 POJO 以在代码中使用。(使用 jaxb2-maven-plugin)
该 pojo 将用于填充字段,然后序列化为 XML 以发送到另一个服务。 (使用 XmlMapper)
我需要找到创建复杂对象集合的正确方法,以便生成的 XML 看起来像这样:
<Request>
<cars>
<car>
<name>golf</name>
<engine>1.6</engine>
<noOfSeats>5</noOfSeats>
</car>
<car>
<name>polo</name>
<engine>1.4</engine>
<noOfSeats>5</noOfSeats>
</car>
<car> ... </car>
</cars>
</Request>
我在这里和那里尝试了不同的解决方案,但我得到的结果如下:
错误 1
<Request>
<cars>
<car>
<car>...</car>
<car>...</car>
</car>
</cars>
</Request>
或
错误 2
<Request>
<cars>
<cars>...</cars>
<cars>...</cars>
</cars>
</Request>
我似乎无法获得具有根列表“cars”和项目“car”的正确定义
在名为 cars 的 Car 的 pojo 列表中。
这是一个失败的场景,但最接近我需要的场景:
XSD
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="cars" type="car" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="car">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
...
</xs:sequence>
</xs:complexType>
生成的请求 class 列表为
List<Car> cars;
这是我所期望的,但是在 Car 的定义中没有根名称标签。
因此在序列化为 XML
时会出现错误 2 的情况
这是我使用的映射器
XmlMapper.builder()
.addModule(new JaxbAnnotationModule())
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.build();
使用 Java 8,spring 启动 2 和 maven
更新
我接受了下面的回复,因为它是正确的并且有效。
但我决定进行更新,因为我的主要问题实际上是序列化程序。
XmlMapper 没有序列化正确的方式或预期的方式。
我最终使用以下方法得到了正确的结果:
public Jaxb2Marshaller mashaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(Request.class);
return marshaller;
}
几乎正确 - 您只需要调整元素 'cars' 的复杂类型定义。我认为您(像许多其他人一样)未能理解元素声明和类型定义之间的区别。一个元素声明代表一个标签。类型声明指定标签的 内容 的规则。
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="cars" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element ref="car" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="car">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="engine" type="xs:string"/>
<xs:element name="numberOfSeats" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
未测试,样式可以改进,但希望您能理解。
我必须创建一个 XSD 以便我可以生成一个 POJO 以在代码中使用。(使用 jaxb2-maven-plugin)
该 pojo 将用于填充字段,然后序列化为 XML 以发送到另一个服务。 (使用 XmlMapper)
我需要找到创建复杂对象集合的正确方法,以便生成的 XML 看起来像这样:
<Request>
<cars>
<car>
<name>golf</name>
<engine>1.6</engine>
<noOfSeats>5</noOfSeats>
</car>
<car>
<name>polo</name>
<engine>1.4</engine>
<noOfSeats>5</noOfSeats>
</car>
<car> ... </car>
</cars>
</Request>
我在这里和那里尝试了不同的解决方案,但我得到的结果如下:
错误 1
<Request>
<cars>
<car>
<car>...</car>
<car>...</car>
</car>
</cars>
</Request>
或
错误 2
<Request>
<cars>
<cars>...</cars>
<cars>...</cars>
</cars>
</Request>
我似乎无法获得具有根列表“cars”和项目“car”的正确定义 在名为 cars 的 Car 的 pojo 列表中。
这是一个失败的场景,但最接近我需要的场景: XSD
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="cars" type="car" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="car">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
...
</xs:sequence>
</xs:complexType>
生成的请求 class 列表为
List<Car> cars;
这是我所期望的,但是在 Car 的定义中没有根名称标签。 因此在序列化为 XML
时会出现错误 2 的情况这是我使用的映射器
XmlMapper.builder()
.addModule(new JaxbAnnotationModule())
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.build();
使用 Java 8,spring 启动 2 和 maven
更新 我接受了下面的回复,因为它是正确的并且有效。 但我决定进行更新,因为我的主要问题实际上是序列化程序。 XmlMapper 没有序列化正确的方式或预期的方式。 我最终使用以下方法得到了正确的结果:
public Jaxb2Marshaller mashaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(Request.class);
return marshaller;
}
几乎正确 - 您只需要调整元素 'cars' 的复杂类型定义。我认为您(像许多其他人一样)未能理解元素声明和类型定义之间的区别。一个元素声明代表一个标签。类型声明指定标签的 内容 的规则。
<xs:element name="Request">
<xs:complexType>
<xs:sequence>
<xs:element name="cars" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element ref="car" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="car">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="engine" type="xs:string"/>
<xs:element name="numberOfSeats" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
未测试,样式可以改进,但希望您能理解。