JaxB наследование, сортирующее абстрактные классы

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

Он достигает всего, что я ищу, за исключением того, что для того, чтобы подклассы были правильно маршалированы и не маршалированы, они должны быть обернуты в класс с определенным @XmlRootElement, Это не позволяет вам представлять сами классы как Xml самостоятельно.

Я хочу, чтобы классы были такими:

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;   

@XmlJavaTypeAdapter(ContactMethodAdapter.class) 
public abstract class ContactMethod {   

}

public class Address extends ContactMethod {       

    protected String street;      
    protected String city;   

}

public class PhoneNumber extends ContactMethod {       

    protected String number;   

}

и я хочу иметь возможность выполнить следующее:

Входные данные:

<contact-method>
   <street>Broadway</street>
   <city>Seattle</city>
</contact-method>

Главный:

public class Demo {       
   public static void main(String[] args) throws Exception  {         
      ContactMethod meth = (ContactMethod ) unmarshaller.unmarshal(xml);

      if(ContactMethod instanceof Address){
         Address addr = (Address) meth;

         addr.getStreet();

         // etc.
      }

      Address marshalAddr = new Address("Broadway", "Seattle");       

      Marshaller marshaller = jc.createMarshaller();         
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);         
      marshaller.marshal((ContactMethod) marshalAddr, System.out);     
   }   
}

Выход:

<contact-method>
   <street>Broadway</street>
   <city>Seattle</city>
</contact-method>

Кто-нибудь знает, как это можно сделать?

1 ответ

Решение

В итоге я использовал один класс (AdaptedContactMethod) для моделирования абстрактного класса. Затем я выполнял маршалинг и демаршаллинг для различных подклассов самостоятельно, а не через @XmlJavaTypeAdapter,

Это позволяет вам поставить @XmlRootElement в вашей реализации AdaptedContactMethod без необходимости заключать его в список.

Другие вопросы по тегам