EclipseLink MOXy:覆盖绑定文件的规则 [英] EclipseLink MOXy: Override rules of binding files
问题描述
在下面的场景中,我会像 java-type name =SubClass
的绑定一样,用于在SuperClass上设置文本字段。但事实并非如此。覆盖bindingsA.xml有问题吗?
根据覆盖规则文档:
I would, in the scenario below, like the binding of java-type name="SubClass"
to be applied to set the text field on SuperClass. However it is not. Is there a problem with overriding the bindingsA.xml?
According to the Overriding rules documentation:
如果多个文件中出现相同的java类型,则后一个文件中设置的任何值都将覆盖上一个文件中的值
If the same java-type occurs in multiple files, any values that are set in the later file, will override values from the previous file
我需要做些什么才能让它发挥作用?
What do I need to do to make it work?
输入:
<?xml version="1.0" encoding="UTF-8"?>
<a text="A text">B text</a>
绑定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>
Bindings B:
<?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
属性。如果这是你真正想做的事情,那么下面就是你可以做到这一点的方法。
It's a bit odd to map the text
property differently on the super and sub classes. If this is something you really want to do, then below is a way you could accomplish this.
SuperClass
package forum17982654;
public class SuperClass {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
SubClass
我们将覆盖超类中的访问器方法。这将帮助我们欺骗MOXy认为 SubClass
有自己的属性 text
。
We will override the accessor methods from the super class. This will help us trick MOXy into thinking that SubClass
has its own property text
.
package forum17982654;
public class SubClass extends SuperClass {
@Override
public String getText() {
return super.getText();
}
@Override
public void setText(String text) {
super.setText(text);
}
}
元数据
bindings.xml
在映射文档中,我们将告诉MOXy真正的超类 SubClass
是 java.lang.Object
。
In the mapping document we will tell MOXy that the real super class of SubClass
is java.lang.Object
.
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum17982654">
<java-types>
<java-type name="SuperClass">
<xml-root-element/>
<java-attributes>
<xml-attribute java-attribute="text"/>
</java-attributes>
</java-type>
<java-type name="SubClass" super-type="java.lang.Object">
<xml-root-element/>
<java-attributes>
<xml-value java-attribute="text"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
演示代码
以下是一些演示您可以运行以证明一切正常的代码:
Demo Code
Below is some demo code you can run to prove that everything works:
演示
package forum17982654;
import java.io.StringReader;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1);
jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "bindings.xml");
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] {SuperClass.class}, jaxbContextProperties);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader superClassXML = new StringReader("<superClass text='Hello Super Class'/>");
SuperClass superClass = (SuperClass) unmarshaller.unmarshal(superClassXML);
System.out.println(superClass.getText());
StringReader subClassXML = new StringReader("<subClass>Hello Sub Class</subClass>");
SubClass subClass = (SubClass) unmarshaller.unmarshal(subClassXML);
System.out.println(subClass.getText());
}
}
输出
Hello Super Class
Hello Sub Class
这篇关于EclipseLink MOXy:覆盖绑定文件的规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!