XSD中生成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> 

似乎我不能得到正确的定义,将有一个根列表"汽车"还有物品和汽车。在pojo列表中,Car被称为cars。

这是一个失败的场景,但最接近我需要的: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>

生成的Request类列表为
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 boot 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>

没有测试,风格可以改进,但希望你能明白。

最新更新