在不可修改的域Java类中重写JAXB绑定

在不可修改的域Java类中重写JAXB绑定,java,xml,binding,jaxb,external,Java,Xml,Binding,Jaxb,External,我花了一整天的时间试图解决这个问题(包括在这个网站上进行大量搜索),但我找不到问题的答案。我正努力做到这一点: 在XML和一些我无法控制的现有Java对象之间进行转换 结果/源XML中的元素名称与Java类的属性名称不同 我仅限于jaxb-2.0 我可以引入一个包装类,它可以包含注释 让我给你看一个我正在努力实现的例子。假设我无法控制的Java类如下所示: public class TopNoControlClass { private BottomNoControlClass b

我花了一整天的时间试图解决这个问题(包括在这个网站上进行大量搜索),但我找不到问题的答案。我正努力做到这一点:

  • 在XML和一些我无法控制的现有Java对象之间进行转换
  • 结果/源XML中的元素名称与Java类的属性名称不同
  • 我仅限于jaxb-2.0
  • 我可以引入一个包装类,它可以包含注释
让我给你看一个我正在努力实现的例子。假设我无法控制的Java类如下所示:

public class TopNoControlClass {

    private BottomNoControlClass bottomNoControlObject;

    public TopNoControlClass(BottomNoControlClass bottomNoControlObject) {
        super();
        this.bottomNoControlObject = bottomNoControlObject;
    }

    public BottomNoControlClass getBottomNoControlObject() {
        return bottomNoControlObject;
    }
    public void setBottomNoControlObject(BottomNoControlClass bottomNoControlObject) {
        this.bottomNoControlObject = bottomNoControlObject;
    }
}
和引用的类:

public class BottomNoControlClass {

    private String foo;

    public BottomNoControlClass(String foo) {
        super();
        this.foo = foo;
    }

    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
}
想象一下我想把这个从编组中弄出来:

<?xml version="1.0" encoding="UTF-8"?>
<Top>
    <Bottom>
        <bar>XXX</bar>
    </Bottom>
</Top>

XXX
将映射到TopNoControlClass,而Bottom将映射到BottomNoControlClass,并映射到BottomNoControlClass的foo属性

为了完成上述工作,我可以创建一个外部XML绑定来声明映射,但我无法找到在运行时使用该外部绑定文件的方法。到目前为止,我看到的所有示例仅在生成时使用外部XML绑定(即作为xjc的参数)

引入一个包装类也不会有问题,它会覆盖它将引用的类(即TopNoControlClass和BottomNoControlClass)的类名和类属性名。使用该类构造JAXBContext并让JAXB完成其余工作将很容易。但我不知道注释应该是什么样子

任何帮助都将不胜感激


雅罗斯拉夫

注意:我是专家组的负责人和成员

在jaxb2(JSR-222)的MOXy实现中,我们为这个用例提供了一个外部映射文档

外部元数据(oxm.xml)

下面是针对您的用例的映射文档的外观。在本例中,将模型类放入名为
forum13318677
的包中。有关更多信息,请参阅:

jaxb.properties

要将MOXy指定为JAXB(JSR-222)提供程序,您需要在与域类相同的包中包含一个名为
JAXB.properties
的文件,其中包含以下条目(请参阅:)

演示

下面的演示代码演示了如何利用MOXy的外部映射文档。注意,即使MOXy用作JAXB提供程序,MOXy上也没有编译时依赖项

package forum13318677;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String,Object>();
        properties.put("eclipselink.oxm.metadata-source", "forum13318677/oxm.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {TopNoControlClass.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13318677/input.xml");
        TopNoControlClass object = (TopNoControlClass) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(object, System.out);
    }

}
UM13318677包;
导入java.io.File;
导入java.util.*;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
映射属性=新的HashMap();
properties.put(“eclipseelink.oxm.metadata source”,“forum13318677/oxm.xml”);
JAXBContext jc=JAXBContext.newInstance(新类[]{TopNoControlClass.Class},属性);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
File xml=新文件(“src/forum13318677/input.xml”);
TopNoControlClass对象=(TopNoControlClass)unmarshaller.unmarshal(xml);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(对象、系统、输出);
}
}

嗨,布莱斯,非常感谢您的深入回复!!在我的搜索中,我发现了你的博客帖子:)我的问题是,我们公司对我们可以使用哪些外部库(以及它们拥有哪些许可证)非常严格。MOXy目前不在已批准的库集中,因此为了让我使用MOXy,我必须与我们的安全工程师一起完成这一艰难的外部库批准过程。因此,我从您的回复中了解到,我无法用标准JAXB实现来实现这一点,这有点令人失望。Jaroslav@Jaroslav-MOXy是一个标准JAXB(JSR-222)实现,它通过了与参考实现相同的所有遵从性测试。MOXy是WebLogic()中的默认JAXB实现,如果您碰巧使用了这两种环境中的任何一种,MOXy也包含在GlassFish()中。您可能还想查看JAXBIntroductions:我毫不怀疑,MOXy是一款漂亮的软件,但我不知道它包含在GlassFish和WebLogic中。对于我们的安全工程师来说,这可能就是足够的理由。谢谢你指出这一点!
package forum13318677;

public class Factory {

    public TopNoControlClass createTopNoControlClass() {
        return new TopNoControlClass(null);
    }

    public BottomNoControlClass createBottomNoControlClass() {
        return new BottomNoControlClass(null);
    }

}
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
package forum13318677;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String,Object>();
        properties.put("eclipselink.oxm.metadata-source", "forum13318677/oxm.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {TopNoControlClass.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13318677/input.xml");
        TopNoControlClass object = (TopNoControlClass) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(object, System.out);
    }

}