2013-02-18 86 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