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)
欲获得更多信息
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
.我删除了一个依赖循环并清除了错误.
希望这对其他人有所帮助.
这是因为,默认情况下,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
归档时间: |
|
查看次数: |
109938 次 |
最近记录: |