jaxb XmlAccessType: пример НЕДВИЖИМОСТИ - PullRequest
2 голосов
/ 24 мая 2010

Я пытаюсь использовать jaxb и хочу использовать 'XmlAccessType.PROPERTY' позволить jaxb использовать геттеры / сеттеры, а не переменные напрямую, но получить разные ошибки в зависимости от того, что я пытаюсь, или переменной совсем не так, как я хочу.

Любая хорошая ссылка или указатель на простой пример?

Например, нижеприведенное делает определение группы не устанавливается при разборе 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 Ответ

3 голосов
/ 08 января 2011

Ответ в том, что ваш пример не ошибочен сам по себе, но есть несколько возможных подводных камней. Вы поместили аннотацию на установщик, а не на получатель. Хотя JavaDoc для @XmlAttribute не устанавливает каких-либо ограничений на это, другие аннотации (например, @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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...