我无法理解为什么抛出这个JAXB IllegalAnnotationException

MyT*_*tle 27 java exception jaxb

这是我的XML文件:

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

    <field mappedField="Type">      
    </field>    
</fields>
Run Code Online (Sandbox Code Playgroud)

我做了2个类来解析它(Fields.java和Field.java):

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

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

public class Field {

    @XmlAttribute(name = "mappedField")
    String mappedField;
    /getter,setter
}
Run Code Online (Sandbox Code Playgroud)

但我得到了这个例外.

[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]
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么这个例外会上升.例外情况在这里:

JAXBContext context = JAXBContext.newInstance(Fields.class);
Run Code Online (Sandbox Code Playgroud)

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

bdo*_*han 50

异常是由于您的JAXB(JSR-222)实现认为有两个映射了相同名称(字段和属性)的东西.您的用例有几种选择:

选项#1 - 使用注释字段 @XmlAccessorType(XmlAccessType.FIELD)

如果要注释该字段,则应指定 @XmlAccessorType(XmlAccessType.FIELD)

Fields.java:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Field.java:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

选项#2 - 注释属性

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

Fields.java:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Field.java:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息

  • 这有帮助,但对我来说实际的问题是,尽管该字段已正确注释,但在类级别 @XmlType 注释中定义的 propOrder 属性中缺少它。 (2认同)

Gra*_*ray 22

我无法理解为什么抛出这个JAXB IllegalAnnotationException

我也得到了### counts of IllegalAnnotationExceptions例外,它似乎是由于我的Spring布线中的不正确的依赖层次结构.

我通过在JAXB代码中抛出一个断点来解决这个问题.对我来说,这是在com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$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.]
....
Run Code Online (Sandbox Code Playgroud)

does not have a no-arg default constructor我看来,这是误导.也许我不明白异常是在说什么.但它确实表明我的问题存在问题LocalContextHandlerCollection.我删除了一个依赖循环并清除了错误.

希望这对其他人有所帮助.

  • 你的答案解决了我的问题.我没想到`no-arg默认构造函数'引起了这个问题.谢谢! (2认同)
  • 堆栈跟踪缺少关键信息。设置断点发现问题。 (2认同)

Gin*_*ead 9

以下之一可能导致异常:

  1. 向Fields类添加一个空的公共构造函数,JAXB使用反射来加载类,这就是抛出异常的原因.
  2. 为列表添加单独的getter和setter.


Lov*_*ija 8

这是因为,默认情况下,Jaxb在序列化pojo时,会查找属性的公共成员(getter或setter)上的注释.但是,您在字段上提供注释.因此,要么在setter或getter属性上更改和设置注释,要么将XmlAccessortype设置为field.

选项1::

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

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

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

       @XmlAttribute(name = "mappedField")
       String mappedField;
       //getter,setter
}
Run Code Online (Sandbox Code Playgroud)

选项2 ::

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

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

        @XmlElement(name = "field")
        public List<Field> getFields() {

        }

        //setter
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

       String mappedField;

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

       }

        //setter
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息和深度,请查看以下JDK文档http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html