2010-05-24 4 views
2

나는, JAXB를 사용하여 직접 JAXB 사용 게터/세터가 아닌 변수를 수 있도록하기 위해 'XmlAccessType.PROPERTY' 를 사용하기를 원하지만 다른 오류가 나는 무엇을하려고에 따라 얻으려고하거나 변수 은 내가 원하는 것처럼 설정되지 않았습니다.JAXB XmlAccessType : 부동산의 예

좋은 링크 또는 간단한 예제에 대한 포인터는 무엇입니까?

@XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.PROPERTY) 
public class E { 
    private EGroup groupDefinition; 

    public EGroup getGroupDefinition() { 
     return groupDefinition; 
    } 
    @XmlAttribute 
    public void setGroupDefinition (EGroup g) { 
     groupDefinition = g; 
    } 
} 
+0

당신이 구문 분석하려고하는 XML을 게시하시기 바랍니다 최신 자바를 사용하여, "내 컴퓨터에서"작동했다. – ekeren

답변

3

대답이 예 자체가 잘못되지 않는 것입니다,하지만 몇 가지 가능한 함정이 있습니다

는 예를 들어, 아래의 XML 문서를 구문 분석 할 때 groupDefintion하지 가 설정 될 수 있습니다. getter가 아닌 setter에 주석을 넣었습니다. @XmlAttribute에 대한 JavaDoc은 이에 대한 제한을 명시하지 않지만 다른 주석 (예 : @XmlID)은 특히 setter 또는 getter 중 하나만 주석을 허용하지만 둘 다를 허용하지는 않습니다.

@XmlAttribute는 요소가 아니라 특성을 필요로합니다. 또한 속성을 파싱하므로 복잡한 유형이 될 수 없습니다. EGroup은 열거 형 일 수 있습니다. 아마도?

나는 당신의 예제를 확장하고 일부 주장, 그리고 그것은 6

@XmlRootElement 
@XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.PROPERTY) 
public class E { 

    private EGroup groupDefinition; 

    public EGroup getGroupDefinition() { 
     return groupDefinition; 
    } 
    @XmlAttribute 
    public void setGroupDefinition (EGroup g) { 
     groupDefinition = g; 
    } 

    public enum EGroup { 
     SOME, 
     OTHERS, 
     THE_REST 
    } 

    public static void main(String[] args) throws JAXBException { 
     JAXBContext jc = JAXBContext.newInstance(E.class); 

     E eOne = new E(); 
     eOne.setGroupDefinition(EGroup.SOME); 

     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
     StringWriter writer = new StringWriter(); 
     m.marshal(eOne, writer); 

     assert writer.toString().equals("<e groupDefinition=\"SOME\"/>"); 

     E eTwo = (E) jc.createUnmarshaller().unmarshal(new StringReader(writer.toString())); 

     assert eOne.getGroupDefinition() == eTwo.getGroupDefinition(); 
    } 
}