Jaxb 具有不同映射的同一对象,具体取决于上下文(MOXy)

Jaxb 具有不同映射的同一对象,具体取决于上下文(MOXy),jaxb,eclipselink,moxy,Jaxb,Eclipselink,Moxy,我正在使用作为我的提供者,需要一些映射文件的帮助来将我的类编组为XML 我正在使用外部文件进行映射 我有两种类型的事务:A和B。 两者都包含带有两个字段(text1和text2)的标题对象(相同对象) 在将这些字段编组为XML时,我希望transactionA头字段的XML标记变成and,而链接到transactionB的字段变成and 你知道我如何做到这一点(最好不用继承) 代码如下: 标题类 公共类标题{ 私有字符串text1; 私有字符串text2; 公共标头(){} 公共字符串getTe

我正在使用作为我的提供者,需要一些映射文件的帮助来将我的类编组为XML

我正在使用外部文件进行映射

我有两种类型的事务:A和B。 两者都包含带有两个字段(text1和text2)的标题对象(相同对象)

在将这些字段编组为XML时,我希望transactionA头字段的XML标记变成and,而链接到transactionB的字段变成and

你知道我如何做到这一点(最好不用继承)

代码如下:

标题类

公共类标题{
私有字符串text1;
私有字符串text2;
公共标头(){}
公共字符串getText1(){
返回文本1;
}
公共void setText1(字符串text1){
this.text1=text1;
}
公共字符串getText2(){
返回文本2;
}
公共void setText2(字符串text2){
this.text2=text2;
}
}
交易A

公共类事务a{
私有标头语句标头;
私有大十进制单位;
私人价格;
公共事务a(){}
公共BigDecimal getUnits(){
返回单元;
}
公共无效设置单位(大十进制单位){
这个。单位=单位;
}
公共价格(){
退货价格;
}
公共无效设置价格(BigDecimal价格){
这个价格=价格;
}
公共标头getStatementHeader(){
返回语句头;
}
公共无效setStatementHeader(Header statementHeader){
this.statementHeader=statementHeader;
}
}
交易B

公共类事务B{
私有标头语句标头;
私有大十进制单位;
私人价格;
公共事务B(){}
公共BigDecimal getUnits(){
返回单元;
}
公共无效设置单位(大十进制单位){
这个。单位=单位;
}
公共价格(){
退货价格;
}
公共无效设置价格(BigDecimal价格){
这个价格=价格;
}
公共标头getStatementHeader(){
返回语句头;
}
公共无效setStatementHeader(Header statementHeader){
this.statementHeader=statementHeader;
}
}
映射文件


结果如您所见,标题B的标签与标题A的标签相同


描述
单位
10
99999999.98999999463558197021484375
Bheader1
Bheader2
10
99999999.98999999463558197021484375

我们已经有一段时间提出了针对这种行为的增强请求。如果你能就以下事项投票,但这将有助于将其提升到我们的优先事项列表


您今天如何做到这一点

XmlAdapter(头部适配器)

您可以使用
XmlAdapter
标题
类提供备用映射

UM13986357的
包;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
公共类HeaderAdapter扩展了XmlAdapter{
公共静态类自适应headerb{
公共字符串头1;
公共字符串头2;
}
@凌驾
public AdaptedHeaderB封送处理程序(标头)引发异常{
AdaptedHeaderB AdaptedHeaderB=新的AdaptedHeaderB();
adaptedHeaderB.headerB1=header.getText1();
adaptedHeaderB.headerB2=header.getText2();
返回自适应headerb;
}
@凌驾
公共头解组器(AdaptedHeaderB AdaptedHeaderB)引发异常{
页眉=新页眉();
header.setText1(适配headerb.headerB1);
header.setText2(适配headerb.headerB2);
返回头;
}
}
oxm.xml

下面是映射文档的更新版本。我已更新了
TransactionB
类中
statementHeader
属性的映射,以指定应使用
XmlAdapter


jaxb.properties

要使用MOXy作为JAXB提供程序,您需要在与域模型相同的包中包含一个名为
JAXB.properties
的文件,其中包含以下条目(http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html):

演示

下面的演示代码可以用来证明一切正常

UM13986357的
包;
导入java.util.*;
导入javax.xml.bind.*;
导入javax.xml.transform.stream.StreamSource;
导入org.eclipse.persistence.jaxb.JAXBContextProperties;
公开课演示{
公共静态void main(字符串[]args)引发异常{
映射属性=新的HashMap(1);
put(JAXBContextProperties.OXM_元数据_源代码,“forum13986357/OXM.xml”);
JAXBContext jc=JAXBContext.newInstance(新类[]{Statement.Class},属性);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
StreamSource xml=new StreamSource(“src/forum13986357/input.xml”);
JAXBElement=unmarshaller.unmarshal(xml,Statement.class);
马歇尔勒马歇尔勒=jc
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory