EclipseLink MOXy:覆盖绑定文件的规则 [英] EclipseLink MOXy: Override rules of binding files

查看:137
本文介绍了EclipseLink MOXy:覆盖绑定文件的规则的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下面的场景中,我会像 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆