Jaxb: Unmarshalling xml com vários namespaces no mesmo pacote
Eu sou novo em usar namespaces em xml, então estou meio confuso e gostaria de alguns esclarecimentos. Eu tenho um serviço java onde estou recebendo documentos xml com muitos namespaces diferentes e enquanto eu tenho que trabalhar, eu sinto que devo ter feito algo errado, então eu quero verificar. No meu package-info.java eu tenho minha anotação de esquema como:
@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
)
Eu tenho um Train.java anotado no nível da classe com:
@XmlRootElement(name="Train", namespace="http://mycompany/train")
e cada campo da turma anotado com:
@XmlElement(name="Color") for example
O trem contém uma lista de passageiro (s), portanto, há uma propriedade
private Set<Passenger> passengers;
e esta coleção é anotada com:
@XmlElementWrapper(name="Passengers")
@XmlElements(@XmlElement(name="Passenger", namespace="http://mycompany/passenger"))
Em seguida, dentro do Passenger.java, a classe em si é anotada com:
@XmlElement(name="Passenger", namespace="http://mycompany/passenger")
Finalmente, para campos individuais dentro do Passenger.java, eles são anotados assim:
@XmlElement(name="TicketNumber", namespace="http://mycompany/passenger")
Então, quando eu tenho um xml que se parece com:
<train:Train>
<train:Color>Red</train:Color>
<train:Passengers>
<train:Passenger>
<passenger:TicketNumber>T101</passenger:TicketNumber>
</train:Passenger>
</train:Passengers>
</train:Train>
Agora eu desmarco este xml que recebi e a propriedade Color do Train está configurada e a propriedade TicketNumber do Passenger está definida. Mas eu não sei porque eu preciso adicionar o url de namespace na anotação XmlElement no TicketNumber para que isso funcione, mas eu não precisei fazer isso para a propriedade Color no Train. Se eu remover o atributo namespace da anotação XmlElement no TicketNumber, o valor do xml não será mapeado para o objeto, a menos que eu também remova o prefixo do namespace da solicitação xml. Eu sinto que desde que eu tenho o atributo namespace definido no XmlRootElement para o Passenger, eu não deveria precisar fazer isso para cada campo na classe, assim como eu não precisava para o Train então eu estou assumindo que eu deve ter configurado algo errado. Alguém pode me apontar na direção certa? Obrigado!