cxf wsdl2java генерирует ArrayOf<Type> вместо Type[]
Я использую команду командной строки cxf wsdl2java для генерации клиента (файлы Java). Мой xsd выглядит примерно так -
<xs:complexType name="ArrayOfString">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="string" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ConfirmSMSResults">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="sessionId" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="smsIds" type="tns:ArrayOfString"/>
</xs:sequence>
</xs:complexType>
Сгенерированный файл Java ConfirmSMSResults.java
есть что-то вроде этого
@XmlElement(required = true)
protected ArrayOfString smsIds;
где это должно быть protected String[] smsIds;
У меня была похожая проблема с date
тип данных, определенный в xsd
файл, который был преобразован в XMLGregorianCalendar
, Тем не менее, я решил это с помощью внешнего xjb
файл и определение привязки там. Это можно найти здесь. Я не могу найти что-то подобное для моей проблемы с массивом.
Заранее спасибо.
2 ответа
Вы говорите, что
так должно быть
protected String[] smsIds
когда на самом деле ваш XSD не говорит так.
Ваш XSD говорит, что smsIDs
это complexType
типа ArrayOfString
который определен вверху, и CXF создаст соответствующий объект ArrayOfString
, Внутри него есть элемент, который называется string
что может происходить несколько раз, поэтому, вероятно, вы найдете свой массив / список внутри ArrayOfString
объект, который он генерирует для вашего XSD.
Если вы хотите удалить этот объект-оболочку, в вашем XSD вы должны изменить это:
<xs:element maxOccurs="1" minOccurs="1" name="smsIds" type="tns:ArrayOfString"/>
в
<xs:element maxOccurs="unbounded" minOccurs="0" name="smsIds" type="xsd:string"/>
Хорошо, похоже, я что-то пропустил. type
свойство относится к ArrayofString
объект, вместо этого должно быть xs:string
, Кажется, нет необходимости ArrayOfStrings
объект. Также, maxOccurs
должно быть равно unbounded
, Конечный результат -
<xs:element name="ConfirmSMSResults">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="sessionId" type="xs:string"/>
<xs:element maxOccurs="unbounded" minOccurs="1" name="smsIds" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Я также добавил collectionType="indexed"
в мой файл xjb. Вот так это выглядит сейчас <jaxb:globalBindings collectionType ="indexed">