#xml #exception #binding #jaxb #unmarshalling
#xml #исключение #привязка #jaxb #отмена сопоставления
Вопрос:
Я довольно новичок в JAXB. мой опыт работы с ним был довольно хорошим, но теперь у меня возникли некоторые проблемы с разархивированием.
Мой класс реализует следующий интерфейс:
public interface Attribute {
public String getAttrName();
public void setAttrName(String s);
public String getAttrValue();
public void setAttrValue(String s);
public Object getPrincipal();
public void setPrincipal(Object o);
}
Где getPricipal возвращает в этом случае пользовательский класс.
Я марширую объект следующим образом:
Marshaller m = context.createMarshaller();
JAXBContext context = JAXBContext.newInstance(AttributeImpl.class, UserImpl.class, RoleImpl.class);
Marshaller m = context.createMarshaller();
m.marshal(attribute, sw);
И он генерирует следующий XML
<profileAttribute>
<attrName>KEY2</attrName>
<attrValue>2_VALUE2</attrValue>
<principal xsi:type="userImpl">
<enabled>true</enabled>
<externallyDefined>false</externallyDefined>
<fullName>NAME</fullName>
<password>PASSWORD</password>
<previousPasswordChangeTime>2011-10-05T11:16:44.960-07:00
</previousPasswordChangeTime>
<roles xsi:type="roleImpl">
<externallyDefined>false</externallyDefined>
<roleName>ROLE_USER</roleName>
</roles>
<roles xsi:type="roleImpl">
<externallyDefined>false</externallyDefined>
<roleName>ROLE_ADMINISTRATOR</roleName>
</roles>
<username>jasperadmin</username>
</principal>
</profileAttribute>
Моя проблема заключается в том, что я пытаюсь разархивировать тот же XML с помощью следующего кода
JAXBContext jc = JAXBContext.newInstance( AttributeImpl.class, UserImpl.class, RoleImpl.class );
Unmarshaller u = jc.createUnmarshaller();
ProfileAttribute pa = (ProfileAttribute) u.unmarshal(req.getInputStream()) ;
Я получаю исключение.
javax.xml.bind.Исключение
UnmarshalException со связанным исключением: [org.xml.sax.SAXParseException: префикс
«xsi» для атрибута «xsi: type», связанного с типом элемента
«принципал», не привязан
- Буду признателен за любые советы о том, что я делаю неправильно.
- Другой вопрос в том, как мне исключить участника из маршалинга?
Спасибо
Ответ №1:
Буду признателен за любые советы о том, что я делаю неправильно.
Похоже, что в реализации (Metro, MOXy, JaxMe и т. Д.) JAXB, Который вы используете, есть ошибка. Из предоставленного вами документа должно было быть объявление пространства имен для xsi
включенного префикса.
<profileAttribute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
....
</profileAttribute>
Какую реализацию и версию JAXB вы используете?
Следующая статья связана с вашим вариантом использования, и вы можете найти ее полезной:
Другой вопрос: как мне исключить участника из маршалинга?
Вы можете использовать @XmlTransient
аннотацию к полю / свойству, чтобы предотвратить маршалирование этого поля / свойства.
Комментарии:
1. Привет, я использую сборку реализации METRO версии 2.1.5. но я думаю, что проблема в том, как я упорядочиваю свой объект. У меня есть коллекция ProfileAttribute, и, поскольку я не знаю, как упорядочить коллекцию, я упорядочиваю каждый элемент с помощью javax.xml.bind. Marshaller.JAXB_FRAGMENT=true поэтому он не добавляет пространства имен Спасибо за быстрый ответ и ссылку на блог, это очень полезно.