【问题标题】:Why doesn't JAXB allow annotations on getters that all pull from the same member variable?为什么 JAXB 不允许对从同一个成员变量中提取的 getter 进行注释?
【发布时间】:2010-12-15 16:18:43
【问题描述】:

为什么示例 A 有效,而示例 B 抛出“JAXB 注释被放置在不是 JAXB 属性的方法上”异常?

我将 JAX-WS 与 Spring MVC 一起使用。

示例 A

package com.casanosa2.permissions;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(name = "FooXMLMapper")
public class FooXMLMapper implements IFoo {

 @XmlElement
 private final boolean propA;

 @XmlElement
 private final boolean propB;

 public FooMapper(IFoo foo) {
  propA = foo.getPropA()
  propB = foo.getPropB()
 }

 public FooMapper() {
  propA = false;
  propB = false;
 }

 @Override
 public boolean getPropA() {
  return propA;
 }

 @Override
 public boolean getPropB() {
  return propB;
 }
}

示例 B

@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(name = "FooXMLMapper")
public class FooXMLMapper {

 private final IFoo foo;

 public FooMapper() {
  foo = new IFoo() {

   @Override
   public boolean getPropA() {
    return false;
   }

   @Override
   public boolean getPropB() {
    return false;
   }

  };
 }

 public FooXMLMapper(IFoo foo) {
  this.foo = foo;
 }

 @XmlElement
 public boolean getPropA() {
  return foo.getPropA();
 }

 @XmlElement
 public boolean getPropB() {
  return foo.getPropB();
 }
}

【问题讨论】:

    标签: java spring-mvc jaxb jax-ws cxf


    【解决方案1】:

    我相信如果直接查看实例变量并且在您的示例 B 中没有正确名称的实际实例变量,则访问器将被忽略。您必须明确告诉它在类上使用 @XmlAccessorType(XmlAccessType.NONE) 并在 get/set 方法上使用 @XmlElement 和 @XmlAttribute。至少,这就是我最终对我的 JAXB 映射所做的事情。

    【讨论】:

    • Bernard 使用属性作为访问类型,因此只应检查 get/set 方法。
    • 你是对的,添加 XmlAccessType.NONE 修复了它。现在我不必有愚蠢的成员变量来复制我已经拥有的数据。 :)
    • XmlAccessType.NONE 会起作用,但它不正确。 NONE 表示仅映射显式注释的内容。如果您使用 FIELD 或 PROPERTY,那么您可以利用默认设置。我仍然认为您的问题涉及指定 PROPERTY 访问权限但注释字段。
    • 我很高兴它成功了,尽管 Blaise 是对的,你应该与访问者一起工作,但我错了。我最终使用了 XmlAccessType.NONE,因为我有很多我不想在 XML 中显示的属性(访问器),而有些我确实做到了。我更容易说 NONE,然后明确指定我想要的。
    • Blaise 我不确定我是否跟上了。示例 B 是失败的示例,我在其中注释了吸气剂。我没有注释成员变量,因为我不希望在 XML 中使用它,因为它只是一个接口,无论如何都不会被理解。
    【解决方案2】:

    我相信它是一个合适的 JAXB 属性,你需要为它们设置 setter 以及 getter。 (您可能还需要一个默认构造函数)。

    【讨论】:

    • 您不需要同时使用 get 和 set 方法。只有 getter 的属性将被视为只写。只有 setter 的属性将被视为只读。
    • @Blaise:反过来,肯定吗? (JAXB 基本上只知道注解的方法……)
    • Only getter = 仅将属性写入 XML,因为没有从 XML 中读取的 setter。只有 setter = 仅从 XML 读取属性,因为没有 getter 来获取要写入 XML 的数据。
    • 我有默认构造函数,如果你没有,它不会将类型添加到 Web 服务 WSDL。
    【解决方案3】:

    我还没有尝试过您的代码,但是看起来错误的是示例 A,而不是 B。在示例 A 中,您已经指定了属性访问器(get/set 方法),但是您已经注释了类字段(实例变量) .

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多