繁体   English   中英

EclipseLink / MOXy如何创建属性名称?

[英]How does EclipseLink/MOXy create the property name?

我写一个代码来设置XmlTransient使用莫西在运行时。 这是部分代码,摘自http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.html上的示例

public void setXmlTransient(Class<?> domainClass, String propertyName) {
    XmlTransient xmlTransient = new XmlTransient();
    xmlTransient.setJavaAttribute(propertyName);
    JavaType javaType = getJavaType(domainClass);
    javaType.getJavaAttributes().getJavaAttribute().add(objectFactory.createXmlTransient(xmlTransient));
}

由于我是以编程方式进行此操作的,因此我需要能够与MOXy完全一样地创建propertyName 对于大多数getter方法名称,如getOrder ,属性名称是通过从方法名称中删除get并将大写的O更改为小写的o ,即属性名称为order 但是,我遇到的情况是我的getter方法是getXInAxInA似乎不是有效的属性名称。 MOXy发出警告,例如

Ignoring attribute [xInA] on class [Atom] as no Property was generated for it.

有谁知道MOXy从getters创建属性名称所使用的规则是什么? 还是知道在不阅读MOXy源代码的情况下可以找到关于此的信息?

短答案

因为连续有两个大写字母,所以属性名称将为XInA


长答案

领域模型(Foo)

以下是带有问题属性的示例Java类。

package forum14945664;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private String x;

    public String getXInA() {
        return x;
    }

    public void setXInA(String x) {
        this.x = x;
    }

}

元数据源(ExampleMetadataSource)

MetadataSource是一种为MOXy提供映射元数据的编程方式。

package forum14945664;

import java.util.*;

import org.eclipse.persistence.jaxb.metadata.MetadataSourceAdapter;
import org.eclipse.persistence.jaxb.xmlmodel.*;
import org.eclipse.persistence.jaxb.xmlmodel.JavaType.*;
import org.eclipse.persistence.jaxb.xmlmodel.XmlBindings.*;

public class ExampleMetadataSource extends MetadataSourceAdapter {

    private ObjectFactory objectFactory;
    private Map<Class<?>, JavaType> javaTypes;
    private XmlBindings xmlBindings;

    public ExampleMetadataSource() {
        objectFactory = new ObjectFactory();
        javaTypes = new HashMap<Class<?>, JavaType>();

        xmlBindings = new XmlBindings();
        xmlBindings.setPackageName("forum14945664");
        xmlBindings.setJavaTypes(new JavaTypes());
    }

    @Override
    public XmlBindings getXmlBindings(Map<String, ?> properties, ClassLoader classLoader) {
        return xmlBindings;
    }

    public JavaType getJavaType(Class<?> clazz) {
        JavaType javaType = javaTypes.get(clazz);
        if(null == javaType) {
            javaType = new JavaType();
            javaType.setName(clazz.getSimpleName());
            javaType.setJavaAttributes(new JavaAttributes());
            xmlBindings.getJavaTypes().getJavaType().add(javaType);
            javaTypes.put(clazz, javaType);
        }
        return javaType;
    }

    public void setXmlTransient(Class<?> domainClass, String propertyName) {
        XmlTransient xmlTransient = new XmlTransient();
        xmlTransient.setJavaAttribute(propertyName);
        JavaType javaType = getJavaType(domainClass);
        javaType.getJavaAttributes().getJavaAttribute().add(objectFactory.createXmlTransient(xmlTransient));
    }

}

将MOXy指定为JAXB Provider(jaxb.properties)

要将MOXy指定为JAXB提供程序,您需要在与域模型相同的包中包含一个名为jaxb.properties的文件,并带有以下条目。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示版

在下面的演示代码中,我们将基于域模型创建一个JAXBContext ,并将一个实例编组为XML。 然后,我们将使用MetadataSource使属性变为瞬态,刷新JAXBContext并再次JAXBContext该实例。

package forum14945664;

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.eclipse.persistence.jaxb.JAXBHelper;

public class Demo {

    public static void main(String[] args) throws Exception {
        ExampleMetadataSource metadata = new ExampleMetadataSource();

        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, metadata);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Foo.class}, properties);

        Foo foo = new Foo();
        foo.setXInA("Hello World");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);

        metadata.setXmlTransient(Foo.class, "XInA");
        JAXBHelper.getJAXBContext(jc).refreshMetadata();
        marshaller.marshal(foo, System.out);
    }

}

输出量

首先,我们看到XInA属性被编组,然后在使它成为瞬态之后,我们看到第二个编组操作中它不在XML中。

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <XInA>Hello World</XInA>
</foo>
<?xml version="1.0" encoding="UTF-8"?>
<foo/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM