2013-02-18 69 views
1

我正在编写代码以在运行时使用MOXy设置XmlTransient。这里是从的例子改编上http://blog.bdoughan.com/2011/06/moxy-extensible-models-refresh-example.htmlEclipseLink/MOXy如何创建属性名称?

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

因为我做这个程序,我需要能够创建propertyName完全相同的方式莫西做代码的一部分。对于大多数getter方法名称,如getOrder,属性名称通过从方法名称中删除get并将大写O更改为小写o即属性名称为order完成。但是,我正在打我的getter方法为getXInA的情况,但xInA似乎不是有效的属性名称。 MOXy会抛出类似如下的警告:

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

有没有人知道MOXy用于从getters创建属性名称的规则是什么?或者在不阅读MOXY源代码的情况下知道我可以在哪里找到这些信息?

回答

1

简短的回答

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


长的答案

域模型(美孚)

下面是一个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(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)); 
    } 

} 

指定莫西为JAXB提供商(jaxb.properties)

要指定莫西,因为你需要包含一个文件JAXB提供在同一个包称为jaxb.properties作为与您的域模型入境后。

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

演示

在演示代码下面我们将创建一个基于域模型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财产整理,再经过我们让它瞬间我们看到它是不是从第二编组操作的XML。

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

非常感谢您的详细解答。这解决了我的问题。我所能做的就是给你一个投票,但这还不够。 – gigadot 2013-02-19 08:48:17

+1

@gigadot - 我已输入以下增强请求,以使我们登录MOXy的消息更加有用:http://bugs.eclipse.org/401510 – 2013-02-22 11:12:14