2016-04-13 3 views
0

У меня есть XSD, из которого я генерирующий некоторые Java-код:Избавиться от JAXBElement из jaxb-сгенерированного кода?

<xs:element name="full-account-v2" > 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Это работает хорошо и дает мне сгенерированный класс под названием FullAccountV2.

Я хочу использовать тот же самый сложный тип в другом месте, поэтому я думал, я хотел бы создать именованный сложный тип в файле XSD, и относятся к нему, как это:

<xs:element name="full-account-v2" type="fullAccountV2Type"/> 

Сложный тип определяется следующим образом :

<xs:complexType name="fullAccountV2Type"> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

Теперь внезапно беспилотник перестает работать. Следующий XML был демаршаллизации просто отлично в FullAccountV2:

<er-response id="100058" version="2"> 
    <payload> 
    <full-account-v2> 
    <ban>BAN_P146058461158163004</ban> 
    <status>401</status> 
    </full-account-v2> 
    </payload> 
</er-response> 

Но теперь уже не кажется, что класс, и XML является unmarshalled по JAXB к JAXBElement с Qnamefull-account-v2 и declaredTypeFullAccountV2Type.

ErResponse и Payload определены в других местах:

<xs:complexType name="payloadType"> 
    <xs:sequence> 
     <xs:any processContents="lax" minOccurs="0" /> 
    </xs:sequence> 
</xs:complexType> 

Я попытался определением типа в отдельном XML-файл в объявление элемента, но получили тот же результат.

Как может такой простой рефактор причинить мне 8 часов борьбы? Что я делаю не так?

NB это, как представляется, обратная this problem

+0

«перестает работать» не является полезной фразой. Подробное описание конкретного сообщения об ошибке или условия – Black

ответ

0

Переключаю

<xs:element name="full-account-v2" type="fullAccountV2" /> 
<xs:complexType name="fullAccountV2"> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

Теперь, JAXB схема компилятор будет генерировать артефакт по FullAccountV2 именем ранее.

Это также нормально, если name и type имеют одинаковую величину i.e, FullAccountV2. Ниже изменения также работает отлично -

<!-- one is element and other is complexType --> 
<xs:element name="fullAccountV2" type="fullAccountV2" /> 
<xs:complexType name="fullAccountV2"> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

Над определением схемы также будет генерировать артефакт FullAccountV2 как раньше. Независимо от того, что мы назначаем type, используется компилятором схемы для получения имени артефакта.

Это также заметно, если вы создаете схему xsd с использованием schemagen. Например - для определения класса показано ниже

@XmlRootElement 
public class Pojo { 
    public Pojo p; 
} 

schemagen генерирует ниже определения схемы

<xs:element name="pojo" type="pojo"/> 
<xs:complexType name="pojo"> 
    <xs:sequence> 
     <xs:element name="p" type="pojo" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 

Обратите внимание, name и type имеют такое же значение, т.е. имя класса по умолчанию.

+0

Сбой: javax.xml.bind.MarshalException - со связанным исключением: [com.sun.istack.internal.SAXException2: не удалось вывести маршал типа «com.mycompany.global.er.decoupling.binding.response.v2.FullAccountV2» как элемент, поскольку отсутствует @XmlRootElement аннотация] ' – mdarwin

Смежные вопросы