我有一个POJO,其中包含需要输出到XML的字段,标记名为“class”。
使用Jersey 2.0,如果客户端请求JSON响应,则JSON对象输出正确,属性名称为“class”。
但是,如果客户端请求XML输出,则Jersey会因HTTP 500内部错误而失败。
检查导致错误的声明是
@XmlElement(name = "class")
private int vclass;
删除XmlElement注释并允许XML使用vclass作为标记名称正常工作。
我如何指示JAXB使用 class 作为标记名称?
答案 0 :(得分:3)
为什么“class”不能用作JAXB中的标记名称
您可以在JAXB中使用“class”作为标记名称。
默认情况下,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;
}
}
答案 1 :(得分:0)
终于发现了什么错误。
不知道为什么变量声明语句中的注释会导致问题。
将@XmlElement注释放在setter方法中可以正常工作。