Создайте массив Java вместо типа Collection с помощью Jaxb из xsd - PullRequest
0 голосов
/ 23 мая 2019

Я хочу знать, кто-нибудь уже использовал привязку данных с помощью jaxb для генерации атрибутов типа массива вместо типа List из схемы xsd, например, вместо генерации List, генерировать Employee []

1 Ответ

0 голосов
/ 23 мая 2019

В вашем 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 в ЛЮБОЙ сопоставленный класс, и это позволит вам манипулировать данными по своему вкусу, предоставляя расширяемый и масштабируемый способ повторного использования вашего анализатора JAXB, который будет легко поддерживать и обновлять по мере необходимости.

...