JAXB "Если у класса есть свойство @XmlElement, у него не может быть свойства @XmlValue." - PullRequest
3 голосов
/ 15 декабря 2011

Я пытаюсь определить привязку объекта XML к Java с использованием JAXB.Все работает отлично, за исключением случаев, когда я пытаюсь создать XML, подобный this :

<request>
    Get Price
    <sessionId>read-only</sessionId>
</request>

из объекта, класс которого определен как this :

@XmlRootElement(name="request")
public class  Request {

    @XmlValue
    public String getCommandID() { return "Get Price"; };

    @XmlElement
    public String getSessionID() { return "read-only"; };

}

Я получаю следующее исключение:

If a class has @XmlElement property, it cannot have @XmlValue property.

Если бы я изменил элемент "sessionId" на атрибут, все работает нормально, но изКонечно, я хочу, чтобы это был Элемент.

Я думал, что JAXB должен быть очень гибким, я уверен, что упускаю что-то очевидное.

Не могли бы вы помочь?

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

Тип документа XML, который вы хотите отобразить, называется «смешанным содержимым». Соответствующая XML-схема будет выглядеть следующим образом:

<xs:element name="request">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="sessionId" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Это означает, что текстовые узлы могут выглядеть смешанными с узлами элемента. Хотя правила преобразования вашего образца документа кажутся тривиальными, следующий документ также будет действительным, а правила будут менее ясными.

<request>
    Get Price
    <sessionId>read-only</sessionId>
    More Text
</request>

Смешанный текст имеет свои применения, но, как правило, осуждается. Предпочтительным подходом будет использование атрибута XML, как описано в вашем вопросе:

<request sessionId="read-only">Get Price</request>

Чтобы увидеть, как JAXB может обрабатывать смешанный текст, см. Аннотацию @XmlMixed:

1 голос
/ 15 декабря 2011

Что-то не так с созданием элемента commandId?например,

<request>
    <commandId>Get Price</commandId>
    <sessionId>read-only</sessionId>
</request>

и

@XmlRootElement(name="request")
public class  Request {

    @XmlElement
    public String getCommandID() { return "Get Price"; };  
    // btw, why's this a constant?

    @XmlElement
    public String getSessionID() { return "read-only"; };  
    // and this too?

}
...