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

Java EclipseLink/MOXy如何创建属性名?,java,jaxb,moxy,Java,Jaxb,Moxy,我正在编写一个代码,使用MOXy在运行时设置xmltransive。下面是根据上的示例改编的代码部分 有人知道MOXy使用什么规则从getter创建属性名吗?或者不必阅读MOXy源代码,我就可以在哪里找到这些信息?简短回答 因为一行中有两个大写字母,所以属性名称将是XInA 长答案 域模型(Foo) 下面是一个示例Java类,其属性来自您的问题 package forum14945664; import javax.xml.bind.annotation.XmlRootElement; @

我正在编写一个代码,使用MOXy在运行时设置
xmltransive
。下面是根据上的示例改编的代码部分


有人知道MOXy使用什么规则从getter创建属性名吗?或者不必阅读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;
    }

}
元数据源(例如MetadataSource)

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));
    }

}
演示

在下面的演示代码中,我们将基于域模型创建一个
JAXBContext
,并将一个实例封送到XML。然后,我们将使用
MetadataSource
使属性暂时化,刷新
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


长答案

域模型(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;
    }

}
元数据源(例如MetadataSource)

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));
    }

}
演示

在下面的演示代码中,我们将基于域模型创建一个
JAXBContext
,并将一个实例封送到XML。然后,我们将使用
MetadataSource
使属性暂时化,刷新
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);
    }

}

非常感谢您的详细回答。这解决了我的问题。我所能做的就是给你投票,但这还不够。@gigadot-我输入了以下增强请求,以使我们登录MOXy的消息更有用:非常感谢你的详细回答。这解决了我的问题。我所能做的就是给你投票,但这还不够。@gigadot-我输入了以下增强请求,以使我们登录MOXy的消息更有用: