我想知道是否有人已经通过jaxb使用数据出价来从xsd模式生成数组类型属性,而不是列表类型,例如,而不是生成List,而是生成Employee []
答案 0 :(得分:0)
在XSD中,您需要指定javatype标记。
<xs:complexType name="restaurant">
<xs:sequence>
<xs:element name="employee" type="employee" >
<xs:annotation>
<xs:appinfo>
<jxb:javaType name="Employee[]"/>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
如何执行此操作的简单示例是,如果我收到一条关于新餐厅订单的消息,则可以创建一个新的Java类,用于根据XML元素根据其字段名称将其映射到各种Java类型。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "restaurant",
propOrder = {
"name",
"employeeArray"
}
)
public class RestaurantOrder {
@XmlElement(name = "name")
protected String name;
@XmlElement(name = "employeeArray")
protected Employee[] employeeArray;
getter and setter for your employee array and name
}
现在,有了JaxB元素后,可以通过将JAXBElement强制转换为新创建的类来执行与以下操作相似的操作来检索数组。
public getArrayFromElement (JAXBElement<?> jaxbMessage) {
RestaurantOrder order = (RestaurantOrder) jaxbMessage.getValue();
return order.getItemArray();
}
编辑:此代码假定您已经设置了正确的XSD并成功解组了对象(如果在那里遇到问题,请在问题中进行澄清)。像这样的类设置的XSD会要求您在xsd中将餐厅订单建立为复杂类型,并将这些元素正确映射到那里,以便能够将jaxb消息成功地投射到所需的类。请注意,我使用String []如果您有一个雇员对象,则可以执行Arraylist或您真正想要的。
另外,您可以通过创建这种关系来使用JAXB接受多种复杂类型。您可以创建命令模式以将未编组的JAXB元素解析并转换为已映射的ANY类,这将使您能够按自己的喜好操作数据,同时提供一种可扩展且可伸缩的方式来重复使用易于维护和维护的JAXB Parser。根据需要更新。
答案 1 :(得分:0)
在jaxb:globalBindings
中使用属性collectionType="indexed"
。
此处更多信息“ Customizing JAXB Bindings”