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">

Другие вопросы по тегам