当前位置: 首页 > 面试题库 >

JAXB继承,封送给编组类的子类

唐阳飇
2023-03-14
问题内容

我正在使用JAXB读写XML。我想要的是使用基本JAXB类进行编组,并使用继承的JAXB类进行编组。这是允许发送方Java应用程序将XML发送到另一个接收方Java应用程序。发送者和接收者将共享一个公共的JAXB库。我希望接收者将XML解组为接收者特定的JAXB类,该类扩展了通用JAXB类。

例:

这是发送方使用的常见JAXB类。

@XmlRootElement(name="person")
public class Person {
    public String name;
    public int age;
}

这是在解组XML时使用的特定于接收者的JAXB类。接收器类具有特定于接收器应用程序的逻辑。

@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
    public doReceiverSpecificStuff() ...
}

编组工作按预期进行。问题在于解组,Person尽管JAXBContext使用子类的包名,但仍解组ReceiverPerson

JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);

我要解组ReceiverPerson。唯一的我已经能够做到这一点的方法是删除@XmlRootElementPerson。不幸的是,这样做阻止Person了封送处理。好像JAXB从基类开始,一直向下进行,直到找到@XmlRootElement具有适当名称的第一个。我试着加入createPerson()该方法返回ReceiverPersonObjectFactory但这并不能帮助。


问题答案:

您正在使用JAXB 2.0对吗?(自JDK6起)

有一个类:

javax.xml.bind.annotation.adapters.XmlAdapter<ValueType,BoundType>

哪个可以继承,并重写以下方法:

public abstract BoundType unmarshal(ValueType v) throws Exception;
public abstract ValueType marshal(BoundType v) throws Exception;

例:

public class YourNiceAdapter
        extends XmlAdapter<ReceiverPerson,Person>{

    @Override public Person unmarshal(ReceiverPerson v){
        return v;
    }
    @Override public ReceiverPerson marshal(Person v){
        return new ReceiverPerson(v); // you must provide such c-tor
    }
}

使用方法如下:

@Your_favorite_JAXB_Annotations_Go_Here
class SomeClass{
    @XmlJavaTypeAdapter(YourNiceAdapter.class)
    Person hello; // field to unmarshal
}

我很确定,通过使用此概念,您可以自己控制编组/解组过程(包括选择要构造的正确[sub | super]类型)。



 类似资料:
  • 我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的示例如下: 我所有的尝试(甚至编组)都失败了。我浏览了BlaiseDoughan的博客,包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html但他们似乎对我的例子都没有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中

  • 我试图写一个类(SalaryEmployee)和子类(ComissionEmployee),但我没有得到正确的工资,我不能做SE1.SetSalesMount(20000)。我哪里出了问题? 这是主要的:

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

  • 我有一个父类和子类、和,它们描述了如何购买水果的不同类型。 在篮子里插入购买的特定水果; 计算购买水果的总价值; 计算用于给定类型水果(水果名称)的总金额 为了与其他项目的类兼容,在各个类中使用的执行要支付金额的计算的方法将具有名称payFruit,返回类型double并且没有参数。此方法必须在接口中声明。 注意:我知道这可能对我的情况很特殊,对其他人没有太大帮助,但我发现这个类层次结构在使用时有

  • 问题内容: 快速问题,我正在学习有关接口和继承的知识。 这不是实际的代码,仅是示例。假设我有抽象类Animal。马,犬等团体有一定的继承权。还有一个“宠物”界面。它将用于Animal的不同子类。犬“狗”的子类实现接口“宠物”。因此,“狗”的所有子类也都实现了“宠物”接口,而不必在“狗”的每个子类上单独实现“宠物”,对吗? 问题答案: 如果你有: 哪里 那么所有扩展StaffMember的类都将继承

  • 请建议应用继承时如何使用。 我有一个抽象类和具体的。应该是不可变的。将放在两者上会导致两个错误: null 我很乐意删除并使用构建器方法,但我正在重构一个公共库(试图优化模型类),我不希望在我的客户端上出现编译错误。 我还发现了解释第二个错误的这个问题。但其意图的逻辑并不清楚https://github.com/rzwitserloot/lombok/issues/945