我有一个POJO,其中包含一个字段,需要将其输出到标记名称为“ class”的XML。
使用Jersey 2.0,如果客户端请求JSON响应,则JSON对象正确输出的属性名称为“ class”。
但是,如果客户端请求XML输出,则Jersey会失败,并显示HTTP 500内部错误。
检查导致错误的语句是@XmlElement(name = "class")private int vclass;
删除XmlElement批注,并允许XML使用vclass作为标记名可以正常工作。
如何指示JAXB将类用作标记名?
最佳答案
为什么“类”不能在JAXB中用作标记名称
您可以在JAXB中使用“类”作为标记名称。
您可能遇到什么问题
默认情况下,JAXB将公共属性视为已映射。由于您注释了一个字段,因此您很可能会遇到有关重复映射属性的异常。
Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "vclass"
this problem is related to the following location:
at public int forum27241550.Foo.getVclass()
at forum27241550.Foo
this problem is related to the following location:
at private int forum27241550.Foo.vclass
at forum27241550.Foo
为什么要修复它
您将以下内容发布为answer:
终于发现了什么问题。
不知道为什么变量声明语句中的注释会
引起问题。
将@XmlElement批注放在setter方法中可以正常工作。
当您将注释移到属性时,该字段不再被视为已映射,因此没有重复的映射问题。
如何在现场保留注释
要注释字段,您应该在类上使用
@XmlAccessorType(XmlAccessType.FIELD)
。import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
@XmlElement(name = "class")
private int vclass;
public int getVclass() {
return vclass;
}
public void setVclass(int vclass) {
this.vclass = vclass;
}
}