выбор xjc и XSD

Когда я запускаю xjc для создания типа Java, представляющего этот фрагмент XSD:

  <xs:complexType name="fileUploadRequest">
    <xs:choice>
      <xs:element name="path" type="xs:string"/>
      <xs:element name="file" type="xs:base64Binary"/>
    </xs:choice>
  </xs:complexType>

Я получаю класс, который неотличим от того, что было бы, если бы вместо этого я указал sequence с необязательными элементами.

Мне нужен тип с небольшим интеллектом, который позволит мне иметь не более 1 элемента по моему выбору за раз. Например, если я вызову сгенерированный метод setFile, он должен сделать путь нулевым. Есть ли какой-нибудь плагин, который я могу использовать для того, что кажется очевидным требованием генератора кода?


person blueimpb    schedule 04.09.2013    source источник


Ответы (1)


binding.xml

Вы можете использовать следующий внешний файл привязки для создания типа свойства, которое вы ищете:

<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          version="2.1">
    <globalBindings choiceContentProperty="true"/>
</bindings> 

Вызов XJC

На файл привязки ссылаются с помощью флага -b.

xjc -b binding.xml schema.xsd

Созданное свойство

Теперь будет сгенерировано следующее свойство:

@XmlElements({
    @XmlElement(name = "path", type = String.class),
    @XmlElement(name = "file", type = byte[].class)
})
protected Object pathOrFile;

Для получения дополнительной информации

person bdoughan    schedule 05.09.2013
comment
Хорошо, это выглядит великолепно функционально, большое спасибо. Я предполагаю, что вы различаете путь и файл, проверяя тип pathOrFile (например, if (pathOrFile instanceof String)). Правильно? Как это работает, когда некоторые элементы выбора относятся к одному типу? - person blueimpb; 07.09.2013
comment
@blueimpb — когда элементы одного типа, результат оборачивается в JAXBElement для сохранения информации об элементе. - person bdoughan; 10.09.2013