Я конвертирую свое веб-приложение в веб-службы с помощью CXF. В моем веб-приложении есть классы, которые работают как перечисление. Пример:
package test.javabean;
import java.util.HashMap;
import java.util.Map;
public class GlassType {
private static Map<String, GlassType> glasses = new HashMap<String, GlassType>();
private final String id;
private final String desc;
private GlassType(String id, String desc) {
this.id = id;
this.desc = desc;
glasses.put(id, this);
}
public static final GlassType RED = new GlassType("R", "Bloody Red");
public static final GlassType BLACK = new GlassType("B", "Pitch Black");
public static final GlassType WHITE = new GlassType("W", "Blind White");
public static GlassType valueOf(final String id) {
return glasses.get(id);
}
public String getDesc() {
return desc;
}
public String getId() {
return id;
}
}
Поскольку я не хочу менять свой класс GlasssType на тип перечисления, я сделал адаптер, чтобы этот класс отображался как перечисление в WSDL. Класс адаптера:
package test.adapters;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import test.javabean.GlassType;
public class GlassTypeEnumAdapter extends XmlAdapter<GlassEnum, GlassType> {
@Override
public GlassEnum marshal(GlassType arg0) throws Exception {
System.out.println("MARSHALLING");
return GlassEnum.valueOf(arg0.getId());
}
@Override
public GlassType unmarshal(GlassEnum arg0) throws Exception {
System.out.println("UNMARSHALLING");
return GlassType.valueOf(arg0.getId());
}
}
Адаптер сопоставляется с классом GlassType с помощью XmlJavaTypeAdapter, упомянутого в package-info.java:
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters( {
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(
value = test.adapters.GlassTypeEnumAdapter.class,
type = test.javabean.GlassType.class) })
package test.javabean;
Класс GlassEnum:
package test.adapters;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlType;
@XmlEnum(String.class)
@XmlType(name = "myEnum")
public enum GlassEnum {
RED("R"), BLACK("B"), WHITE("W");
private final String id;
private GlassEnum(String id) {
this.id = id;
}
private GlassEnum() {
this.id = "RED";
}
public String getId() {
return id;
}
}
WSDL сгенерирован с правильным type = "myEnum" везде, где я использовал GlassType.
Страница Стандарты для аннотирования служб и типов с помощью JAX-WS и JAXB говорят
Когда мой клиент веб-службы отправляет значение GlassType, адаптер вызывается для Marshall myEnum в GlassType. НО, когда мой веб-сервис отвечает клиенту с помощью GlassType, выдается следующая ошибка:
Я провел несколько тестов и заметил, что класс Adapter не вызывается для Unmarshalling GlassType. Я что-то здесь упустил?
Также было бы полезно альтернативное решение.
ПРОБЛЕМА: