【问题标题】:Why "class" cannot be use as tag name in JAXB为什么“类”不能用作 JAXB 中的标记名称
【发布时间】:2014-12-02 03:50:43
【问题描述】:

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

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

但是,如果客户端请求 XML 输出,Jersey 将失败并出现 HTTP 500 内部错误。

检查导致错误的语句是

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

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

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

【问题讨论】:

  • 这很可能不是@XmlElement(name = "class") 的问题。我在很多场合都有class元素,一点问题都没有。

标签: java xml jaxb jersey


【解决方案1】:

为什么“类”不能用作 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;
    }

}

【讨论】:

    【解决方案2】:

    终于查出问题所在了。

    不知道为什么变量声明语句中的注解会出问题。

    将@XmlElement 注解放在setter 方法中可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2013-07-05
      • 2015-11-28
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多