尝试解组时出现SAXParseException

时间:2011-10-08 09:40:04

标签: xml exception binding jaxb unmarshalling

我是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” “委托人”没有约束

  1. 任何关于我做错事的建议都将不胜感激。
  2. 另一个问题是我如何排除成员被编组?
  3. 由于

1 个答案:

答案 0 :(得分:3)

  

对于我所做错的任何建议都将不胜感激。

似乎您正在使用的JAXB的实现(Metro,MOXy,JaxMe等)中存在错误。从您提供的文档中,应该包含xsi前缀的名称空间声明。

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

您使用的是哪种JAXB实现和版本?

以下文章与您的用例有关,您可能会觉得它很有帮助:

  

另一个问题是如何排除成员被编组?

您可以在字段/属性上使用@XmlTransient注释来阻止该字段/属性被编组。