Inheritance EclipseLink MOXy:覆盖绑定文件的规则
在下面的场景中,我希望应用Inheritance EclipseLink MOXy:覆盖绑定文件的规则,inheritance,jaxb,eclipselink,overriding,moxy,Inheritance,Jaxb,Eclipselink,Overriding,Moxy,在下面的场景中,我希望应用java type name=“SubClass”的绑定来设置超类上的文本字段。但事实并非如此。重写bindingsA.xml是否有问题? 根据报告: 如果相同的java类型出现在多个文件中,则在后一个文件中设置的任何值都将覆盖前一个文件中的值 我需要做什么才能让它工作 输入: <?xml version="1.0" encoding="UTF-8"?> <a text="A text">B text</a> <?xml ve
java type name=“SubClass”
的绑定来设置超类上的文本字段。但事实并非如此。重写bindingsA.xml是否有问题?
根据报告:
如果相同的java类型出现在多个文件中,则在后一个文件中设置的任何值都将覆盖前一个文件中的值
我需要做什么才能让它工作
输入:
<?xml version="1.0" encoding="UTF-8"?>
<a text="A text">B text</a>
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="test">
<java-types>
<java-type name="SuperClass">
<xml-root-element name="a"/>
<java-attributes>
<xml-element java-attribute="text" xml-path="@text" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="test">
<java-types>
<java-type name="SuperClass" xml-transient="true"></java-type>
<java-type name="SubClass">
<xml-root-element name="a"/>
<java-attributes>
<xml-element java-attribute="text" xml-path="text()" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
public class SuperClass {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public class SubClass extends SuperClass { }
Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1);
List<String> bindings = new LinkedList<String>();
bindings.add("bindingsA.xml");
bindings.add("bindingsB.xml");
jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, bindings);
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] {SuperClass.class}, jaxbContextProperties);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SuperClass superClass = (SuperClass)unmarshaller.unmarshal(new File("input.xml"));
System.out.println(superClass.getText());
[EL Warning]: 2013-07-31 16:08:07.771--Ignoring attribute [text] on class [SubClass] as no Property was generated for it.
A text
演示:
<?xml version="1.0" encoding="UTF-8"?>
<a text="A text">B text</a>
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="test">
<java-types>
<java-type name="SuperClass">
<xml-root-element name="a"/>
<java-attributes>
<xml-element java-attribute="text" xml-path="@text" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="test">
<java-types>
<java-type name="SuperClass" xml-transient="true"></java-type>
<java-type name="SubClass">
<xml-root-element name="a"/>
<java-attributes>
<xml-element java-attribute="text" xml-path="text()" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
public class SuperClass {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public class SubClass extends SuperClass { }
Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1);
List<String> bindings = new LinkedList<String>();
bindings.add("bindingsA.xml");
bindings.add("bindingsB.xml");
jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, bindings);
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] {SuperClass.class}, jaxbContextProperties);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SuperClass superClass = (SuperClass)unmarshaller.unmarshal(new File("input.xml"));
System.out.println(superClass.getText());
[EL Warning]: 2013-07-31 16:08:07.771--Ignoring attribute [text] on class [SubClass] as no Property was generated for it.
A text
在超类和子类上以不同的方式映射
text
属性有点奇怪。如果这是你真正想做的事情,那么下面是一个你可以完成的方法
Java模型
超类
用于UM17982654的包;
公共类超类{
私有字符串文本;
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
}
子类
我们将重写超类中的访问器方法。这将帮助我们诱使MOXy认为子类
有自己的属性文本
用于UM17982654的包;
公共类子类扩展了超类{
@凌驾
公共字符串getText(){
返回super.getText();
}
@凌驾
公共void setText(字符串文本){
super.setText(文本);
}
}
元数据
bindings.xml
在映射文档中,我们将告诉MOXy,子类
的真正超类是java.lang.Object
演示代码
下面是一些演示代码,您可以运行这些代码来证明一切正常:
演示
用于UM17982654的包;
导入java.io.StringReader;
导入java.util.*;
导入javax.xml.bind.*;
导入org.eclipse.persistence.jaxb.JAXBContextFactory;
导入org.eclipse.persistence.jaxb.JAXBContextProperties;
公开课演示{
公共静态void main(字符串[]args)引发异常{
Map jaxbContextProperties=newhashmap(1);
put(jaxbContextProperties.OXM_元数据_源,“bindings.xml”);
JAXBContext JAXBContext=JAXBContextFactory.createContext(新类[]{SuperClass.Class},jaxbContextProperties);
Unmarshaller Unmarshaller=jaxbContext.createUnmarshaller();
StringReader超类XML=新StringReader(“”);
SuperClass SuperClass=(SuperClass)unmarshaller.unmarshal(superClassXML);
System.out.println(超类.getText());
StringReader子类XML=新的StringReader(“Hello子类”);
SubClass SubClass=(SubClass)unmarshaller.unmarshal(SubClass xml);
System.out.println(子类.getText());
}
}
输出
Hello Super Class
Hello Sub Class
在超类和子类上以不同的方式映射
text
属性有点奇怪。如果这是你真正想做的事情,那么下面是一个你可以完成的方法
Java模型
超类
用于UM17982654的包;
公共类超类{
私有字符串文本;
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
}
子类
我们将重写超类中的访问器方法。这将帮助我们诱使MOXy认为子类
有自己的属性文本
用于UM17982654的包;
公共类子类扩展了超类{
@凌驾
公共字符串getText(){
返回super.getText();
}
@凌驾
公共void setText(字符串文本){
super.setText(文本);
}
}
元数据
bindings.xml
在映射文档中,我们将告诉MOXy,子类
的真正超类是java.lang.Object
演示代码
下面是一些演示代码,您可以运行这些代码来证明一切正常:
演示
用于UM17982654的包;
导入java.io.StringReader;
导入java.util.*;
导入javax.xml.bind.*;
导入org.eclipse.persistence.jaxb.JAXBContextFactory;
导入org.eclipse.persistence.jaxb.JAXBContextProperties;
公开课演示{
公共静态void main(字符串[]args)引发异常{
Map jaxbContextProperties=newhashmap(1);
put(jaxbContextProperties.OXM_元数据_源,“bindings.xml”);
JAXBContext JAXBContext=JAXBContextFactory.createContext(新类[]{SuperClass.Class},jaxbContextProperties);
Unmarshaller Unmarshaller=jaxbContext.createUnmarshaller();
StringReader超类XML=新StringReader(“”);
SuperClass SuperClass=(SuperClass)unmarshaller.unmarshal(superClassXML);
System.out.println(超类.getText());
StringReader子类XML=新的StringReader(“Hello子类”);
SubClass SubClass=(SubClass)unmarshaller.unmarshal(SubClass xml);
System.out.println(子类.getText());
}
}
输出
Hello Super Class
Hello Sub Class