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, поэтому я предполагаю, что Должно быть, что-то настроено неправильно. Может ли кто-нибудь указать мне правильное направление? Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос