SAXParseException при попытке демонтажа - PullRequest
2 голосов
/ 08 октября 2011

Я довольно новичок в 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", связанного с типом элемента "Principal", не связан

  1. Любой совет о том, что я делаю неправильно, будет оценен.
  2. Другой вопрос, как я могу исключить члена от маршалинга?

Спасибо

1 Ответ

3 голосов
/ 08 октября 2011

Любой совет о том, что я делаю неправильно, будет принят.

Кажется, что в реализации (Metro, MOXy, JaxMe и т. Д.) JAXB есть ошибка, котораяты используешь.В предоставленном вами документе должно быть объявление пространства имен для включенного префикса xsi.

<profileAttribute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    ....
</profileAttribute>

Какую реализацию и версию JAXB вы используете?

Следующая статья связана с вашим вариантом использования, и вы можете найти его полезным:

Другой вопрос: как исключить члена из списка маршалинга?

Вы можете использовать аннотацию @XmlTransient для поля / свойствачтобы не допустить маршалинга этого поля / свойства.

...