gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:11 25 4
gpt4 key购买 nike

我正在编写一段代码,使用 MOXy 在运行时设置 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 使用什么规则从 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)

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 提供程序 (jaxb.properties)

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

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

演示

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

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 属性已编码,然后在将其设置为 transient 后,我们会发现它不在第二次编码操作的 XML 中。

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

关于java - EclipseLink/MOXy 如何创建属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14945664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com