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