我正在使用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
。唯一的我已经能够做到这一点的方法是删除@XmlRootElement
从Person
。不幸的是,这样做阻止Person
了封送处理。好像JAXB从基类开始,一直向下进行,直到找到@XmlRootElement
具有适当名称的第一个。我试着加入createPerson()
该方法返回ReceiverPerson
到ObjectFactory
但这并不能帮助。
您正在使用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