为什么“class”不能在JAXB中用作标记名称

时间:2014-12-02 03:50:43

标签: java xml jaxb jersey

我有一个POJO,其中包含需要输出到XML的字段,标记名为“class”。

使用Jersey 2.0,如果客户端请求JSON响应,则JSON对象输出正确,属性名称为“class”。

但是,如果客户端请求XML输出,则Jersey会因HTTP 500内部错误而失败。

检查导致错误的声明是

@XmlElement(name = "class") private int vclass;

删除XmlElement注释并允许XML使用vclass作为标记名称正常工作。

我如何指示JAXB使用 class 作为标记名称?

2 个答案:

答案 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方法中可以正常工作。