2014-02-08 8 views
4

Apache Commons Configuration에서 CompositeConfiguration 클래스를 확장하는 클래스가 있습니다. 나는 그것을 MOXy를 사용하여 XML로 마샬링하려고한다. 구성을 간단한 이름/값 개체 목록으로 변환하는 XML 어댑터를 만들었습니다.어댑터를 사용하여 MOXy 또는 다른 JAXB 구현으로 루트 요소에 클래스를 마샬링

나는 아래에있는 것들에 많은 변형을 시도했지만 여전히 곤란하다. JAXB 컨텍스트를 만들 때 어댑터 클래스가로드되고 인스턴스화되지만 구성 객체를 마샬링하면 결코 호출되지 않습니다.

MOXy 소스 코드를 보면 루트 요소 인 Java 클래스에 XML 어댑터를 지정할 수 없다고 생각하기 시작했습니다. 이 작업을 제대로 수행하기 위해 올바른 방향으로 가고 있습니까? 아니면 완전히 다른 방법으로이 작업을 수행 할 수 있습니까?

XML 어댑터 :

public class JAXBConfigurationAdapter extends XmlAdapter<Object, BetterBaseConfiguration> 
{ 

    @Override 
    public Object marshal(final BetterBaseConfiguration javaObject) throws Exception 
    { 
     List<ConfigurationPropertyXmlType> jaxbConfiguration = new ArrayList<>(); 
     Iterator<String> keys = javaObject.getKeys(); 
     while (keys.hasNext()) 
     { 
      String key = keys.next(); 
      ConfigurationPropertyXmlType property = new ConfigurationPropertyXmlType(); 
      property.setKey(key); 
      property.setValue(javaObject.getString(key)); 
      jaxbConfiguration.add(property); 
     } 

     return jaxbConfiguration; 
    } 

    @Override 
    public CompositeConfiguration unmarshal(final Object jaxbObject) throws Exception 
    { 
     BetterBaseConfiguration configuration = new BetterBaseConfiguration(); 
     for (ConfigurationPropertyXmlType property : (List<ConfigurationPropertyXmlType>) jaxbObject) 
     { 
      configuration.setProperty(property.getKey(), property.getValue()); 
     } 

     return configuration; 
    } 

} 

이름/값 클래스 :

public class ConfigurationPropertyXmlType 
{ 
    private String key; 
    private String value; 

    public String getKey() 
    { 
     return key; 
    } 

    public String getValue() 
    { 
     return value; 
    } 

    public void setKey(final String key) 
    { 
     this.key = key; 
    } 

    public void setValue(final String value) 
    { 
     this.value = value; 
    } 
} 

은 EclipseLink 맵핑 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
<xml-bindings version="2.5" xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" 
     http://www.eclipse.org/eclipselink/xsds/persistence/oxm http://www.eclipse.org/eclipselink/xsds/eclipselink_oxm_2_5.xsd" 
    package-name="myapp.configuration"> 

    <xml-schema element-form-default="QUALIFIED"> 
     <xml-ns prefix="mynm" namespace-uri="http://mynamespace" /> 
    </xml-schema> 

    <java-types> 
     <java-type name="myapp.configuration.BetterBaseConfiguration" > 
      <xml-java-type-adapter value="myapp.configuration.JAXBConfigurationAdapter" type="myapp.configuration.BetterBaseConfiguration" /> 
      <xml-root-element name="Configuration" /> 
     </java-type> 
    </java-types> 

</xml-bindings> 

원하는 출력 :

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <property> 
     <name>some name</name> 
     <value>some value</value> 
    </property> 
</configuration> 

답변

2

EclipseLink MOXy 및 기타 JAXB (JSR-222) 공급자는 마샬링 될 루트 개체에 XmlAdapter을 적용하지 않습니다. 마샬링을 수행하기 전에 또는 비 정렬 화를 수행 한 후에 명시 적으로 어댑터 논리를 호출 할 수 있습니다.

+1

확인해 주셔서 감사합니다. 나는 그것이 사실이었다라고 꽤 확신했다. 그러나 나는 그것의 문서를 발견 할 수 없었다. –

+0

나는 또한 비슷한 문제를 찾고있다. 내가 마샬링하고 unmarshalled 루트 객체에만 JAXB 이외의 EclipseLink Moxy 같은 별도의 종속성을 사용하지 않고, 마샬링을하기 전에 또는 루트 객체에서 비주얼 랭킹을 수행 한 후에 어떻게 어댑터 로직을 명시 적으로 호출 할 수 있습니까? – user3095047