我有一些旧代码(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/