jaxb XmlAccessType:PROPERTY示例

时间:2010-05-24 08:18:40

标签: java xml jaxb

我正在尝试使用jaxb并希望使用'XmlAccessType.PROPERTY' 让jaxb使用getter / setter而不是直接变量,但得到 不同的错误取决于我尝试的或变量 根本不像我想要的那样。

任何一个简单示例的好链接或指针?

例如,下面的内容不是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;
    }
}

1 个答案:

答案 0 :(得分:3)

答案是你的例子本身没有错,但有一些可能的陷阱。 您已将注释放在setter上,而不是getter。虽然@DmlAttribute的JavaDoc没有对此进行任何限制,但其他注释(例如@XmlID)特别允许注释setter或getter,但不能同时注释两者。

请注意,@ 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();
    }
}