从xsd用Jaxb生成Java数组而不是Collection类型

时间:2019-05-23 00:59:53

标签: java arrays xsd jaxb

我想知道是否有人已经通过jaxb使用数据出价来从xsd模式生成数组类型属性,而不是列表类型,例如,而不是生成List,而是生成Employee []

2 个答案:

答案 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