JAXBContext и аннотация @XmlNsForm - PullRequest
       36

JAXBContext и аннотация @XmlNsForm

1 голос
/ 06 сентября 2011

Просьба пролить свет на настройку JAXBContext. Дано:

  • клиентская библиотека com.mycompany.user01234 с несколькими JAXB-аннотированные классы
  • все классы - простые POJO, расположенные в одном пакете
  • классы помечены @XmlType

Клиентский экземпляр com.mycompany.user01234.UserClass1.class на сервер через конечную точку веб-службы. На стороне сервера я делаю следующее:

JAXBContext jbc = JAXBContext.newInstance("com.mycompany.user01234")
Unmarshaller um = jbc.createUnmarshaller();
JAXBElement<Object> element = um.unmarshal(source, Object.class);
Object customerInput = element.getValue();

И это прекрасно работает ТОЛЬКО , если я исправлю клиентскую библиотеку следующим package-info.java:

@XmlSchema(elementFormDefault = XmlNsForm.QUALIFIED)
package com.mycompany.user01234;

К своему стыду, я не нашел четкого объяснения того, что такое аннотация @XmlNsForm и как она влияет на процесс распаковки. Это первый вопрос.

Второй вопрос: возможно ли (в данном макете) поместить это значение QUALIFIED в некоторые свойства или значения по умолчанию для JAXBContext или использовать другие не декларативные средства, позволяющие избавиться от package-info.java.

Заранее большое спасибо!

1 Ответ

2 голосов
/ 06 сентября 2011

Это в точности соответствует атрибуту elementFormDefault элемента <xs:schema> (т. Е. Элемента верхнего уровня документа схемы XML). То, что он делает (с этой константой), является состоянием, что элементы из пространства имен, определенного схемой, должны быть представлены с квалификатором (то есть как <foo:bar> вместо <bar>); Точный способ объявления пространства имен также зависит от двух стилей. С точки зрения инфо-набора XML эти два стиля полностью эквивалентны; если пространства имен правильно объявлены в XML, JAXB должен быть одинаково счастлив (я считаю, что он должен использовать это значение только при сериализации).

Возможно, вы захотите попытаться сделать свой JAXBContext, передав класс, который вы ожидаете, так что вы немного менее зависимы от кода обнаружения (предполагая, что действительно создается класс FooBar):

JAXBContext jbc = JAXBContext.newInstance(FooBar.class);
FooBar customerInput = (FooBar) jbc.createUnmarshaller().unmarshal(source);

(Приведенный выше код абстрагирован от вещей, которые я делаю в наборе тестов моего кода, которые определенно уже работают.)

...