【问题标题】:JAXB - Using @xmlvalue with a token fieldJAXB - 将 @xmlvalue 与令牌字段一起使用
【发布时间】:2018-02-21 12:19:28
【问题描述】:

这似乎是一个基本问题,但我无法在其他地方找到答案。如果是重复发帖,请见谅。

是否可以在标记为@XmlAccessorType(XmlAccessType.FIELD) 的类上添加@XmlValue 注释?

我正在尝试使用 JAXB 解析 XML 文件,虽然 XML 本身非常大并且有其他字段,但问题是特定于该字段的:

<root>
  ...
  <holiday holidayId="9">Christmas</holiday>
  ...
</root>

映射是:

public class Holiday extends Model {
    @XmlAttribute(name="holidayId")
    private String holidayId;
    @XmlValue
    private String holiday;
}

该字段在 XML 中声明为令牌类型。

@XmlValue 注释给了我一个 IllegalAnnotationException(如果我注释掉 @XmlValue 和 holiday 字段,映射工作正常)。为什么会失败?解决方法是什么?请指教。

【问题讨论】:

  • 模型中有什么?你能分享整个班级和xml吗?
  • 如果您共享整个 xml 和类,那么我们可以详细查看。
  • Model 是一个相当基础的类。只提供方便的方法,例如使用 GSON 将整个对象转换为 JSON。不幸的是,由于机密性,我无法共享整个 XML,但我已经注释了对 @XmlValue 的引用并成功解析了整个 XML。解析失败的唯一时间是当我有一个尝试访问其值的特定字段的类时,如上所示。
  • 您应该将IllegalAnnotationException 的确切异常消息添加到您的问题中。

标签: java xml jaxb


【解决方案1】:

是的,它应该可以正常工作。我使用了这些类:

@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement(name = "holiday")
    List<Holiday> holidays;
}

.

@XmlAccessorType(XmlAccessType.FIELD)
public class Holiday {

    @XmlAttribute(name="holidayId")
    private String holidayId;

    @XmlValue
    private String holiday;
}

对我来说效果很好。我将您的 XML 示例输入与此测试代码一起使用:

JAXBContext context = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
File file = new File("root.xml");
Root root = (Root) unmarshaller.unmarshal(file);

Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);

【讨论】:

  • 感谢您的确认。有趣的是,当我尝试使用具有不同元素的相同配置(在 XSD 类型 def 中声明为字符串)时,代码工作正常。使用带有令牌类型字段的 @XmlValue 注释似乎有一些限制。
  • @user1452030 是的,@XmlValue 有一些限制。例如:如果一个类具有@XmlElement 属性,则它不能具有@XmlValue 属性。您需要发布您的确切异常消息和您的Java 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2015-02-23
  • 1970-01-01
  • 2011-07-24
  • 2013-03-07
  • 1970-01-01
  • 2014-02-05
相关资源
最近更新 更多