有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java jaxb XmlAccessType:属性示例

我正在尝试使用jaxb并希望使用“XmlAccessType”。财产 让jaxb使用getter/setter而不是直接使用变量,但是 不同的错误取决于我的尝试或变量 一点也不像我想要的那样

有没有指向简单示例的好链接或指针

例如,下面的命令使groupdefination不可用 解析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) 个答案

  1. # 1 楼答案

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

    请注意,@XmlAttribute需要的是属性,而不是元素。此外,由于它解析属性,因此不能是复杂类型。那么EGroup可能是一个枚举

    我扩展了您的示例并添加了一些断言,它使用最新的Java6“在我的机器上”工作

    @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();
        }
    }