【问题标题】:SAXParseException while trying to unmarshal尝试解组时出现 SAXParseException
【发布时间】:2011-10-08 09:40:04
【问题描述】:

我对 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:type”的“xsi” “principal”不受约束

  1. 任何关于我做错了什么的建议都将不胜感激。
  2. 另一个问题是如何将成员排除在编组之外?

谢谢

【问题讨论】:

    标签: xml exception binding jaxb unmarshalling


    【解决方案1】:

    任何关于我做错了什么的建议将不胜感激。

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

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

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

    以下文章与您的用例相关,您可能会发现它对您有所帮助:

    另一个问题是如何将成员排除在编组之外?

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

    【讨论】:

    • 您好,我正在使用 METRO 实现构建版本 2.1.5。但我认为问题在于我编组对象的方式。我有一个 ProfileAttribute 集合,因为我不知道如何编组一个集合,所以我用 javax.xml.bind.Marshaller.JAXB_FRAGMENT=true 编组每个元素,所以它不添加命名空间感谢您的快速响应和博客链接,它非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多