2017-11-25 6 views
0

자바로 개발하면서 특정 XML 구조로 열거 형을 마샬링하고 싶습니다.특정 XML 구조로 열거 형을 마샬링하는 Jaxb

@XmlRootElement (name="custom-enum") 
public enum CustomEnum { 
    CUSTOM_ENUM_VALUE_1 ("value 1"), 
    CUSTOM_ENUM_VALUE_2 ("value 2"), 
    CUSTOM_ENUM_VALUE_3 ("value 3"); 

    private String value; 

    CustomEnum(String value) { 
     this.value = value; 
    } 

    @XmlElement (name="value") 
    public String getValue() { 
     return value; 
    } 

    @XmlElement (name="key") 
    public String getName() { 
     return name(); 
    } 
} 
:이 같은 그 주석을 시도

<custom-enum> 
    <key>CUSTOM_ENUM_VALUE_1</key> 
    <value>value 1</value> 
</custom-enum> 

:

public enum CustomEnum { 
    CUSTOM_ENUM_VALUE_1 ("value 1"), 
    CUSTOM_ENUM_VALUE_2 ("value 2"), 
    CUSTOM_ENUM_VALUE_3 ("value 3"); 

    private String value; 

    CustomEnum(String value) { 
     this.value = value; 
    } 
} 

내가 좋아하는 것 같은 구조로 marhsal하려면 다음의 내가 같은 매우 간단한 열거가 있다고 가정 해 봅시다

하지만 작동하지 않습니다 ...

+1

. [this] (https://stackoverflow.com/questions/4656992/providing-custom-value-serialization-for-enums-via-jaxb) 질문을 참조하십시오. – chinoy

+0

그래,하지만 어떻게하면 어댑터의 재정의 된 마샬 (marshal) 메소드에서 구조를 생성하는지 알 수 없다. –

답변

0

여기에서 XMLAdapter를 사용할 수 있습니다.

열거

package com.test.jaxb; 

public enum CustomEnum { 
    CUSTOM_ENUM_VALUE_1 ("value 1"), 
    CUSTOM_ENUM_VALUE_2 ("value 2"), 
    CUSTOM_ENUM_VALUE_3 ("value 3"); 

    private String value; 

    CustomEnum(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return this.value; 
    } 

    public CustomEnum fromValue(String value) { 
     CustomEnum result = null; 
     for (CustomEnum enumVal : CustomEnum.values()) { 
      if (enumVal.value.equals(value)) { 
       result = enumVal; 
       break; 
      } 
     } 
     if(result == null) { 
      throw new IllegalArgumentException("CustomEnum does not supported for value " + value); 
     } 
     return result; 
    } 
} 

POJO 상당

package com.test.jaxb; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class AdaptedEnum { 
    @XmlElement(name="key") 
    private String enumName; 
    @XmlElement(name="value") 
    private String enumvalue; 

    public String getEnumName() { 
     return enumName; 
    } 

    public void setEnumName(String enumName) { 
     this.enumName = enumName; 
    } 

    public String getEnumvalue() { 
     return enumvalue; 
    } 

    public void setEnumvalue(String enumvalue) { 
     this.enumvalue = enumvalue; 
    } 

} 

형태 어댑터 마샬링하는

package com.test.jaxb; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class Adapter extends XmlAdapter<AdaptedEnum, CustomEnum> { 

    @Override 
    public AdaptedEnum marshal(CustomEnum arg0) throws Exception { 
     AdaptedEnum result = new AdaptedEnum(); 
     result.setEnumName(arg0.name()); 
     result.setEnumvalue(arg0.getValue()); 
     return result; 
    } 

    @Override 
    public CustomEnum unmarshal(AdaptedEnum arg0) throws Exception { 
     return CustomEnum.valueOf(arg0.getEnumvalue()); 
    } 


} 
,358, 소비자 루트 요소

package com.test.jaxb; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement(name="root") 
public class RootElement { 

    private CustomEnum customEnum = CustomEnum.CUSTOM_ENUM_VALUE_1; 

    @XmlJavaTypeAdapter(Adapter.class) 
    @XmlElement(name="cusom-enum") 
    public synchronized CustomEnum getCustomEnum() { 
     return customEnum; 
    } 

    public synchronized void setCustomEnum(CustomEnum customEnum) { 
     this.customEnum = customEnum; 
    } 


} 

테스트 코드 현재 사용자 정의 어댑터를 사용할 필요가

package com.test.jaxb; 

import java.io.StringReader; 

import javax.xml.bind.JAXB; 
import javax.xml.bind.JAXBException; 

public class JAXBTester { 

    public static void main(String[] args) throws JAXBException { 
     JAXB.marshal(new RootElement(), System.out); 
     String input = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n" + 
       "<root>\r\n" + 
       " <cusom-enum>\r\n" + 
       "  <key>CUSTOM_ENUM_VALUE_1</key>\r\n" + 
       "  <value>value 1</value>\r\n" + 
       " </cusom-enum>\r\n" + 
       "</root>"; 
     RootElement root = JAXB.unmarshal(new StringReader(input), RootElement.class); 
     System.out.println(root.getCustomEnum()); 

    } 

}