我花了一整天时间试图找出这个问题(包括在这个网站上进行广泛搜索),但我无法找到问题的答案。我正在努力实现这个目标:
让我向您展示一下我想要实现的目标。让我们假设我无法控制的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>
&lt; Top&gt; 将映射到 TopNoControlClass 和&lt; Bottom&gt; Bottom将映射到 BottomNoControlClass 和&lt; bar&gt; 将映射到 BottomNoControlClass 的 foo 属性。
为了做到这一点,我会很自然地创建一个可以说明映射的外部XML绑定,但我无法想出在运行时使用该外部绑定文件的方法。到目前为止,我所见过的所有示例仅在生成时使用外部XML绑定(即作为xjc的参数)。
我也不会遇到引入包装类的问题,该类会覆盖它所引用的类的类名和类属性名(即 TopNoControlClass 和 BottomNoControlClass < / em>的)。使用该类构造 JAXBContext 很容易,让JAXB完成剩下的工作。但我无法弄清楚该注释应该是什么样子。
非常感谢任何帮助
的Jaroslav
答案 0 :(得分:0)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
在JAXB 2(JSR-222)的MOXy实现中,我们为这个用例提供了一个外部映射文档。
外部元数据(oxm.xml)
下面是您的用例的映射文档。出于此示例的目的,将模型类放在名为forum13318677
的包中。有关详细信息,请参阅:http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum13318677">
<java-types>
<java-type name="TopNoControlClass">
<xml-root-element name="Top"/>
<xml-type factory-class="forum13318677.Factory" factory-method="createTopNoControlClass"/>
<java-attributes>
<xml-element java-attribute="bottomNoControlObject" name="Bottom"/>
</java-attributes>
</java-type>
<java-type name="BottomNoControlClass">
<xml-type factory-class="forum13318677.Factory" factory-method="createBottomNoControlClass"/>
<java-attributes>
<xml-element java-attribute="foo" name="bar"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
<强>工厂强>
由于你的模型类没有0参数构造函数,我需要创建一个工厂类(参见:http://blog.bdoughan.com/2011/06/jaxb-and-factory-methods.html)。此类是在@XmlType
注释的XML表示中配置的。
package forum13318677;
public class Factory {
public TopNoControlClass createTopNoControlClass() {
return new TopNoControlClass(null);
}
public BottomNoControlClass createBottomNoControlClass() {
return new BottomNoControlClass(null);
}
}
的 jaxb.properties 强>
要将MOXy指定为JAXB(JSR-222)提供程序,您需要在与域类相同的包中包含一个名为jaxb.properties
的文件,并带有以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。< / p>
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<强>演示强>
下面的演示代码演示了如何利用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);
}
}