当前位置: 首页 > 知识库问答 >
问题:

解析XML期间引发JAXB IllegalAnnotationException

孟翰海
2023-03-14

这是我的XML文件:

<fields>
    <field mappedField="Num">
    </field>
    
    <field mappedField="Type">      
    </field>    
</fields>

我创建了两个类来解析它(Fields.java和Field.java):

@XmlRootElement(name = "fields")
public class Fields {

    @XmlElement(name = "field")
    List<Field> fields = new ArrayList<Field>();
        //getter, setter
}

public class Field {

    @XmlAttribute(name = "mappedField")
    String mappedField;
    //getter,setter
}

但我有一个例外:

[INFO] com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
[INFO]  at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:66) ~[na:1.6.0_07]
[INFO]  at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:422) ~[na:1.6.0_07]
[INFO]  at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:270) ~[na:1.6.0_07]

我不明白为什么会出现这种例外。例外情况如下:

JAXBContext context = JAXBContext.newInstance(Fields.class);

我使用JDK 1.6_0.0.7。谢谢。

共有3个答案

巫马星雨
2023-03-14

下列情况之一可能导致异常:

  1. 向Fields类添加一个空的公共构造函数,JAXB使用反射来加载类,这就是引发异常的原因。
  2. 为您的列表添加单独的getter和setter。
邬浩涆
2023-03-14

我不明白为什么会抛出这个JAXB IllegalAnnotationException

我还得到了IllegalAnnotationExceptions的###计数异常,这似乎是由于Spring连接中的不正确的依赖层次结构造成的。

我通过在JAXB代码中放置断点来解决这个问题。对我来说,这是在com.sun.xml.bind.v2.runtime.IllegalAnnotationsExc0019$Builder.check()。然后我转储了list变量,它给出了如下内容:

[org.mortbay.jetty.Handler is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
    at org.mortbay.jetty.Handler
    at public org.mortbay.jetty.Handler[] org.mortbay.jetty.handler.HandlerCollection.getHandlers()
    at org.mortbay.jetty.handler.HandlerCollection
    at org.mortbay.jetty.handler.ContextHandlerCollection
    at com.mprew.ec2.commons.server.LocalContextHandlerCollection
    at private com.mprew.ec2.commons.server.LocalContextHandlerCollection com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection.arg0
    at com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection,
org.mortbay.jetty.Handler does not have a no-arg default constructor.]
....

没有无参数默认构造函数在我看来似乎有误导性。也许我不明白例外是怎么说的。但它确实表明我的LocalContextHandlerCollection存在问题。我删除了一个依赖循环,错误被清除。

希望这将有助于其他人。

云长恨
2023-03-14

这个异常是由于您的JAXB(JSR-222)实现认为有两个映射为相同名称的东西(一个字段和一个属性)。对于您的用例,有两个选项:

选项1-用@xmlacessortype(xmlacesstype.Field)

如果要注释该字段,则应指定@xmlacessortype(xmlacesstype.field)

领域。爪哇:

package forum10795793;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "fields")
@XmlAccessorType(XmlAccessType.FIELD)
public class Fields {

    @XmlElement(name = "field")
    List<Field> fields = new ArrayList<Field>();

    public List<Field> getFields() {
        return fields;
    }

    public void setFields(List<Field> fields) {
        this.fields = fields;
    }

}

领域爪哇:

package forum10795793;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

    @XmlAttribute(name = "mappedField")
    String mappedField;

    public String getMappedField() {
        return mappedField;
    }

    public void setMappedField(String mappedField) {
        this.mappedField = mappedField;
    }

}

选项#2-注释属性

缺省访问器类型为XmlAccessType。PUBLIC.这意味着默认情况下,JAXB实现将公共字段和访问器映射到XML。使用默认设置,您应该注释要覆盖默认映射行为的公共访问器。

领域。爪哇:

package forum10795793;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "fields")
public class Fields {

    List<Field> fields = new ArrayList<Field>();

    @XmlElement(name = "field")
    public List<Field> getFields() {
        return fields;
    }

    public void setFields(List<Field> fields) {
        this.fields = fields;
    }

}

领域爪哇:

package forum10795793;

import javax.xml.bind.annotation.*;

public class Field {

    String mappedField;

    @XmlAttribute(name = "mappedField")
    public String getMappedField() {
        return mappedField;
    }

    public void setMappedField(String mappedField) {
        this.mappedField = mappedField;
    }

}

了解更多信息

  • http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html
 类似资料:
  • 问题内容: 我目前正在使用DOM解析器来解析XHTML文档,例如: 我的问题是,当我的文档包含一个实体引用时,例如: 我的解析器为包含“€”而不是“&euro;”的内容创建了一个Text节点。这就是说,它正在按预期的方式解析实体(XHTML 1.0 Strict DTD链接到ENTITIES Latin1 DTD,这反过来确定了“&euro;”与“€”的对等)。 问题是,我不希望解析器执行此类操作

  • 问题内容: 我以为应该使用十进制数字执行无限精度算术的答案。 考虑以下代码段: 我希望通过,但实际上执行程序甚至没有到达那里:引发原因! 事实证明,此行为已在API中明确记录: 在的情况下,精确商可具有无限长的十进制扩展数;例如,1除以3。如果商具有不间断的十进制扩展数,并且指定了该操作以返回精确的结果,则抛出an 。否则,将返回除法的精确结果,就像其他操作一样。 进一步浏览API,人们发现实际上

  • 问题内容: 我有一个名为的变量,它具有以下格式的今天的日期:。然后,将其格式化为MySQL的Date类型格式,即。这段代码可以做到: 我要做的是将其恢复为Date类型。我尝试了一些方法,但是它们没有用。主要解决方案是按照其他的问题中所述进行操作](http://codingdict.com/questions/2936),并通过一个小小的mod达到了我想要的功能: 但是它不起作用,因为尝试解析时出

  • untangle untangle 是一个简洁的用于解析 XML 文档的库。输入一个 XML 文档后,untangle 将文档的结构映射成结点和属性,并返回一个 Python 对象。 形如以下的 XML 文件: <?xml version="1.0"?> <root> <child name="child1"> </root> 可以使用以下的方法进行加载: import untangl

  • 我将日期作为一个存储在数据库中,格式为“2 15 201 5”(大概是“m d yyyy”?)。下面代码中的包含获取日期的方法的返回值。我想解析日期,以便设置。基于Java中字符串到日期转换的实例 挠头。

  • 问题内容: 我不是开发人员,只是涉足编程。我从来不了解的一个领域是XML解析。可悲的是,对于我最新的“项目”,我需要为一个Android应用执行此操作。它是我正在工作的原型。 我有这个XML(模型文件): 我有一些代码可以让我获得每个的NodeList: 我不确定下一步该怎么做。我的代码对此似乎很长。我一直在搜寻更好的方法,但发现一些更简洁的代码,无法上班。 有没有很好的Android XML教程