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