java - 使用自定义类作为 JAX-WS 参数 : How to write JAXB adapter for type safe enum?

标签 java web-services xml-serialization jaxb jax-ws

我有一些旧代码(Java 1.5 之前)使用类来实现类型安全枚举,例如:

public class MyTypeSafeEnum implements java.io.Serializable {
  private final int value;

  private  MyTypeSafeEnum(int value) {
   this.value = value
  }

  public static final MyTypeSafeEnum FIRST_VALUE = new MyTypeSafeEnum(0)
  public static final MyTypeSafeEnum SECOND_VALUE = new MyTypeSafeEnum(1)
  public static final MyTypeSafeEnum THIRD_VALUE = new MyTypeSafeEnum(2)

  public static fromInt(int value) {
   //Builds a MyTypeSafeEnum from the value, implementation omitted
   return theMyTypeSafeEnum;
  }

  public int getValue() {
    return this.value;
  }
 }

我想将这些枚举类用作 JAX-WS 操作中的参数,但在生成的 WSDL 中,类型的定义为空:

<xs:complexType name="myTypeSafeEnum">
  <xs:sequence/>
</xs:complexType>

我想我应该使用 XmlAdapter ,所以我创建了以下类:

public class MyTypeSafeEnumXmlAdapter extends XmlAdapter<MyTypeSafeEnum, Integer> {
  @Override
  public MyTypeSafeEnum marshal(Integer v) throws Exception {
      return MyTypeSafeEnum.fromInt(v);
  }

  @Override
  public Integer unmarshal(MyTypeSafeEnum e) throws Exception {
      return e.getValue();
  }
}

我在我的类中添加了 @XmlJavaTypeAdapter(MyTypeSafeEnumXmlAdapter.class) 注释,但它对生成的 WSDL 没有影响。

如何将这些类用作 JAX-WS 操作中的参数?目前,重构代码以使用 enum 类型是不可能的。

最佳答案

您需要反转 MyTypeSafeEnumXmlAdapter 中类型的顺序:

public class MyTypeSafeEnumXmlAdapter extends XmlAdapter<Integer, MyTypeSafeEnum> {
    @Override
    public Integer marshal(MyTypeSafeEnum v) throws Exception {
        return v.getValue();
    }

    @Override
    public MyTypeSafeEnum unmarshal(Integer v) throws Exception {
        return MyTypeSafeEnum.fromInt(v);
    }
}

那么如果你有这样一个类:

public class MyClass {
    private MyTypeSafeEnum someVar;

    @XmlJavaTypeAdapter(MyTypeSafeEnumXmlAdapter.class)
    public MyTypeSafeEnum getSomeVar() {
        return someVar;
    }
}

它将生成如下 XML:

<xs:complexType name="myClass">
    <xs:sequence>
        <xs:element minOccurs="0" name="someVar" type="xs:int"/>
    </xs:sequence>
</xs:complexType>

Web 服务客户端将该字段视为整数。因此,您必须确保它们不会传入未映射到枚举实例之一或以某种方式处理它的整数。

关于java - 使用自定义类作为 JAX-WS 参数 : How to write JAXB adapter for type safe enum?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6877120/

相关文章:

java - 我将如何使用 slf4j/log4j/java.util.logging robuSTLy 记录二进制或 XML?

用于创建 xml 和从 xml 读取(序列化/反序列化)的 c++ linux 库

java - 当我尝试在 Linux 上运行我的程序时抛出错误(在 Windows 上运行良好)

java - AWS Lambda - 缓冲读取器

java - 将集合对象从一个 jsp 传输到另一个 jsp

javascript - 使用纯javascript发送Ajax请求从json文件中获取json数据

c# - XML 序列化异常

java - 在Java中计算正整数的n次方根

c# - 在网络服务中使用 p4.net

multithreading - 在Java中的RESTful Web服务上使用线程