Исключение SAXParseException при попытке отменить маршализацию

#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. Буду признателен за любые советы о том, что я делаю неправильно.
  2. Другой вопрос в том, как мне исключить участника из маршалинга?

Спасибо

Ответ №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 поэтому он не добавляет пространства имен Спасибо за быстрый ответ и ссылку на блог, это очень полезно.