Я использую JAXB для маршалинга классов Java. Я не могу понять, какую аннотацию xml я должен использовать в следующем сценарии:
XSD:
...
<xs:complexType name = "Message">
<xs:sequence>
<xs:element name = "memberOne" type = "xs:hexBinary"/>
<xs:element name = "memberTwo" type = "xs:unsignedByte"/>
<xs:choice>
<xs:element name = "typeOne" type = "MessageTypeOne"/>
<xs:element name = "typeTwo" type = "MessageTypeTwo"/>
<xs:element name = "typeThree" type = "MessageTypeThree"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
..
MessageTypeOne/Two/Three
определены ранее, но не важны для этого сценария.
Классы Java:
Message.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Message", propOrder = {
"memberOne",
"memberTwo",
})
public class Message{
@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(HexBinaryAdapter.class)
@XmlSchemaType(name = "hexBinary")
protected byte[] memberOne;
@XmlSchemaType(name = "unsignedByte")
protected short memberTwo;
//Which annotations i have to use here?
protected MessageBody messageBody;
...
}
MessageBody.java
//Which annotations i have to use here?
public class MessageBody {
//Which annotations i have to use here?
MessageType myChoice;
...
}
MessageBody
не упоминается в файле XSD. Это должно быть "проигнорировано" при маршалинге. Только член его класса myChoice
должен быть выстроен.
Я уже думал о реализации своего собственного XmlAdapter
, но не смог найти способ решить проблему.
MessageType.java
public abstract class MessageType { ... }
Это базовый класс.
MessageTypeOne.java
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MessageTypeOne", propOrder = {
"memberOne",
"memberTwo",
})
public class MessageTypeOne extends MessageType {
@XmlSchemaType(name = "unsignedByte")
protected short memberOne;
@XmlSchemaType(name = "unsignedByte")
protected short memberTwo;
...
}
MessageTypeTwo/Three
похожи на этот.
Пример вывода XML, который я могу сейчас получить:
<Message>
<memberOne>01020304</memberOne>
<memberTwo>5</memberOne>
<MessageBody>
<MessageTypeOne>
...
</MessageTypeOne>
</MessageBody>
</Message>
Желаемый вывод XML:
<Message>
<memberOne>01020304</memberOne>
<memberTwo>5</memberOne>
<MessageTypeOne>
...
</MessageTypeOne>
</Message>
Поэтому я просто хочу удалить тег <MessageBody> .. </MessageBody>
.
Очевидно, я просто хочу прояснить проблему. На самом деле код намного сложнее.
Мне НЕ разрешено изменять файл XSD и разрешено вносить только незначительные изменения в классы java. Я НЕ могу изменить отношение классов друг к другу.
Мои вопросы:
Какие аннотации нужно использовать, чтобы пропустить класс
MessageBody
при маршаллинге? Как я могу указать JAXB, что нужно упорядочивать только своих участниковmyChoice
?Как полиморфизм работает в JAXB? Какую аннотацию мне нужно использовать для этого?
Можно ли в целом решить эту проблему с помощью JAXB?
РЕДАКТИРОВАТЬ: добавлены примеры выходных данных XML
MessageBody
28.05.2017MessageBody
класс. При демаршаллинге мне нужно снова создатьMessageBody
. Я нашел решение, которое выглядит не очень чистым, но я думаю, что в JAXB нет другого выхода. Я отправлю это позже. 29.05.2017