Использование пользовательского класса в качестве параметра JAX-WS: Как написать адаптер JAXB для enum типа safe? - PullRequest
2 голосов
/ 29 июля 2011

У меня есть старый код (до 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 не подлежит обсуждению.

1 Ответ

1 голос
/ 29 июля 2011

Вам необходимо изменить порядок типов в вашем 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 какthis:

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

Клиенты веб-службы будут видеть это поле как целое число.Поэтому вам нужно убедиться, что они не передают целое число, которое не отображается на один из экземпляров enum, или не обрабатывают его каким-либо образом.

...