我有一个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;
    }

}

09-10 14:27