我是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在这种情况下返回User类。
我像这样编组对象:
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” “委托人”没有约束
由于
答案 0 :(得分:3)
对于我所做错的任何建议都将不胜感激。
似乎您正在使用的JAXB的实现(Metro,MOXy,JaxMe等)中存在错误。从您提供的文档中,应该包含xsi
前缀的名称空间声明。
<profileAttribute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
....
</profileAttribute>
您使用的是哪种JAXB实现和版本?
以下文章与您的用例有关,您可能会觉得它很有帮助:
另一个问题是如何排除成员被编组?
您可以在字段/属性上使用@XmlTransient
注释来阻止该字段/属性被编组。