Наследование Jaxb с использованием замещения, но не для корневого элемента

Я шел через БлейзБлог сhttp://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html для наследования Jaxb с использованием замещения.

Я хочу реализовать то же самое, но не для корневого элемента. Я смотрю этот тип XML в качестве вывода.

   
    
      
        
            1 A Street
        
        
            2 B Street
        
        
            xxx-xxx-xxxx
         
     
 

Ниже приведен файл Configuration.java.

    import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement
     public class Configuration {

    private Customer customer;

    public Customer getCustomer() {
        return customer;
    }

     public void setCustomer(Customer customer) {
        this.customer = customer;
     }

    @Override
    public String toString() {
        return "\n Customer[ customer="+customer+"]";
     }

     }

Customer.java

     public class Customer {
private List contactInfo;

@XmlElementRef
public List getContactInfo() {
    return contactInfo;
}

public void setContactInfo(List contactInfo) {
    this.contactInfo = contactInfo;
}

    }

Address.java

  public class Address extends ContactInfo {
private String street;

public String getStreet() {
    return street;
}

public void setStreet(String street) {
    this.street = street;
}

}

PhoneNumber.java

    public class PhoneNumber extends ContactInfo{
private String mobileNo;

public String getMobileNo() {
    return mobileNo;
}

public void setMobileNo(String mobileNo) {
    this.mobileNo = mobileNo;
}

   }

Demo.java

     import java.util.ArrayList;
     import java.util.List;

     import javax.xml.bind.JAXBContext;
     import javax.xml.bind.Marshaller;

      public class Demo {
    public static void main(String[] args) throws Exception {
    Configuration configuration = new Configuration();
    Customer customer = new Customer();
    List contacts = new ArrayList();

    Address address = new Address();
    address.setStreet("1 A Street");
    contacts.add(address);

    Address address1 = new Address();
    address1.setStreet("2 B Street");
    contacts.add(address1);

    PhoneNumber phone = new PhoneNumber();
    phone.setMobileNo("408 431 8829");
    contacts.add(phone);

    customer.setContactInfo(contacts);

    configuration.setCustomer(customer);

    JAXBContext jc = JAXBContext.newInstance(Configuration.class);
    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(configuration, System.out);
    }
 }

В настоящее время я получаю следующее исключение

    Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:     1 counts of IllegalAnnotationExceptions
    Invalid @XmlElementRef : Type "class Address" or any of its subclasses are not known to this context.

Кто-нибудь может мне помочь в этом?

Спасибо, кватра

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

Решение Вопроса

Проблема № 1 - Подклассы A

JAXB (JSR-222) Реализация не может автоматически обнаружить подклассы. Вы можете решить первое исключение, используя@XmlSeeAlso аннотация наContactInfo класс для ссылки на подклассы:

@XmlSeeAlso({Address.class, PhoneNumber.class})
public class ContactInfo {
}

Или вы можете ссылаться на них при создании.JAXBContext

 JAXBContext jc = JAXBContext.newInstance(Configuration.class, Address.class, PhoneNumber.class);

Проблема № 2 - Картирование

Когда используешь@XmlElementRef вам нужно соединить это с@XmlRootElement, Если вы неЯ не хочу идти по этому пути, который вы могли бы использовать@XmlElements вместо.

@XmlElements({
    @XmlElement(name="address", type=Address.class),
    @XmlElement(name="phoneNumber", type=PhoneNumber.class)
})
public List<contactinfo> getContactInfo() {
    return contactInfo;
}
</contactinfo>
http://blog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html
 Obscur Moirage07 янв. 2015 г., 18:58
Используется решение №2. работает !
 Rohit V12 февр. 2019 г., 22:56
@XmlElements работал в моем случае, когда помещен в суперкласс. я использую@XmlTransient в суперклассе вместе сXmlAlso, Подклассы используют@XmlType(propOrder), как-то@XmlTransient заставляет JAXB игнорировать@XmlSeeAlso декларация.
 Tony17 янв. 2017 г., 09:15
@XmlElementRef а также@XmlRootElement не работа для меня,@XmlElements спас меня
 kwatra21 июн. 2013 г., 21:29
Спасибо Блейз за быстрый ответ. Это работает как шарм.

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