2010-05-24 46 views
2

我試圖使用JAXB和要使用的「XmlAccessType.PROPERTY」 直接讓JAXB使用getter/setter方法,而不是變化,而是取決於我嘗試 不同的錯誤得到,或變量 沒有像我想要的那樣設置。JAXB XmlAccessType:性質實施

任何好的鏈接或指向一個簡單的例子?

例如,下面讓groupDefintion不 來解析XML文檔時,可以設置:

@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 2010-05-25 11:25:46

回答

3

答案是,你的榜樣是沒有錯的本身,而是有幾個可能的陷阱。 您已將註釋放在setter上,而不是getter。儘管用於@XmlAttribute的JavaDoc沒有對此進行任何限制,但其他註釋(例如@XmlID)特別允許註釋器或注入器註釋,但不能同時註釋。

注意@XmlAttribute期望的屬性,而不是元素。而且,由於它解析了一個屬性,因此它不是一個複雜的類型。所以EGroup可能是一個枚舉,也許?

我擴大你的榜樣,並增加了一些斷言,和它的作品「我的機器上」,利用最新的Java 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(); 
    } 
}