2010-05-24 78 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(); 
    } 
}