当前位置: 首页 > 知识库问答 >
问题:

Jaxb继承使用替换而不是根元素

金晗日
2023-03-14

我正在浏览使用替换的Jaxb继承的Blaise's Bloghttp://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html。

我想实现相同的功能,但不想实现根元素。我将这种类型的XML视为输出。

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <configuration>
      <customer>
        <address>
            <street>1 A Street</street>
        </address>
        <address>
            <street>2 B Street</street>
        </address>
        <phoneNumber>
            <mobileNo>xxx-xxx-xxxx</mobileNo>
         </phoneNumber>
     </customer>
 </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> contactInfo;

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

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

    }

住址Java语言

  public class Address extends ContactInfo {
private String street;

public String getStreet() {
    return street;
}

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

}

电话号码。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<ContactInfo> contacts = new ArrayList<ContactInfo>();

    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个答案

洪安顺
2023-03-14

问题#1-子类

JAXB(JSR-222)实现不能自动发现子类。您可以使用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;
}
  • http://blog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html
 类似资料:
  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A

  • 操作步骤: 菜单栏: Refactor —> Replace Inheritance with Delegation...

  • 在创建我的班级结构时,我努力坚持利斯科夫替代原则。我想在Day类中存储一组日历项。需要有几种不同类型的日历项,例如: 任命项目 备注项目 轮换项目 它们都共享一些抽象基类CalendarItem中的常见功能: 但例如RotaItem有一些额外的功能: 其他类也添加了自己的逻辑等。 我有一组CalendarBaseItem用于我的日课: 但在回顾这一点时,我可以看到我正在打破LSP原则,因为我必须检

  • 问题内容: 我有看起来像这样的XML: 我想使用JAXB进行阅读。 我知道我能做 如果XML看起来像 ,但是我对上面的XML布局怎么办? 问题答案: 注意: 我是EclipseLink JAXB(MOXy)的负责人,并且是JAXB 2.X(JSR-222)专家组的成员。 您可以在此用例中使用MOXy的扩展名:

  • 问题内容: 您对此设计决定有何看法?它有什么优点和缺点? 链接: 嵌入说明 问题答案: 在注释中,您想知道嵌入的想法是否足以“完全替换继承”。我会说这个问题的答案是“是”。几年前,我使用名为Snit的Tcl OO系统进行了非常简短的介绍,该系统使用组合和委派来排除继承。Snit与Go的方法仍然有很大不同,但是在这一方面,它们具有一些共同的哲学基础。这是一种将功能和职责结合在一起的机制,而不是类的层

  • 问题内容: 我有两节课: 我想将类B编组为xml元素,并添加类A的属性fieldOfClassB和fieldOfClassA,但在编组期间会显示以下警告消息: 请注意,这两个类来自两个不同的程序包,我无法更改此对象模型。 先感谢您! 编辑: 我正在使用外部绑定文件。 问题答案: 从您发布的日志消息中,我可以看到您正在使用MOXy的外部映射文档(请参阅http://blog.bdoughan.com