Jaxb: Unmarshalling XML с несколькими пространствами имен в одном пакете
Я новичок в использовании пространств имен в XML, поэтому я немного растерялся и хотел бы получить некоторые разъяснения. У меня есть java-сервис, где я получаю XML-документы со многими различными пространствами имен, и, хотя у меня это работает, я чувствую, что, должно быть, сделал что-то не так, поэтому я хочу проверить. В моем package-info.java у меня есть аннотация схемы, такая как:
@javax.xml.bind.annotation.XmlSchema(
xmlns={
@javax.xml.bind.annotation.XmHS(prefix="train", namespaceURI="http://mycompany/train"),
@javax.xml.bind.annotation.XmHS(prefix="passenger", namespaceURI="http://mycompany/passenger")
},
elementFormDefault = javax.xml.bind.annotation.XmlNsForm=QUALIFIED
)
У меня есть Train.java с комментариями на уровне класса:
@XmlRootElement(name="Train", namespace="http://mycompany/train")
и каждое поле в классе помечено:
@XmlElement(name="Color") for example
Поезд содержит список пассажиров, поэтому есть свойство
private Set<Passenger> passengers;
и эта коллекция помечена:
@XmlElementWrapper(name="Passengers")
@XmlElements(@XmlElement(name="Passenger", namespace="http://mycompany/passenger"))
Затем в Passenger.java сам класс помечается с помощью:
@XmlElement(name="Passenger", namespace="http://mycompany/passenger")
Наконец, для отдельных полей в Passenger.java они помечаются так:
@XmlElement(name="TicketNumber", namespace="http://mycompany/passenger")
Поэтому, когда у меня есть XML, который выглядит следующим образом:
<train:Train>
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
Теперь я распаковываю полученный xml, и устанавливается свойство Train's Color, а также устанавливается свойство TicketNumber для Passenger. Но я не знаю, почему мне нужно добавить URL-адрес пространства имен в аннотации XmlElement в TicketNumber, чтобы это работало, но мне не нужно было это делать для свойства Color в Train. Если я удалю атрибут пространства имен из аннотации XmlElement в TicketNumber, значение из xml не будет сопоставлено с объектом, если я также не удалю префикс пространства имен из запроса xml. Я чувствую, что, поскольку у меня есть атрибут namespace, определенный в XmlRootElement для Passenger, мне не нужно делать это для каждого отдельного поля в классе, так же как мне не нужно было это делать для Train, поэтому я предполагаю, что Должно быть, что-то настроено неправильно. Может ли кто-нибудь указать мне правильное направление? Спасибо!