Создание веб-службы (WSDL 1.2 или выше) из параметризованного класса в Java (Apache CXF, Axis 2) - PullRequest
2 голосов
/ 29 июля 2010

У меня есть абстрактный класс, который выглядит следующим образом.

public abstract class Entity<PK extends Serializable> implements Serializable {

    private PK id;

    //getters and setters generated here....
}

public class User extends Entity<Long> {

   //all attributes, getters and setters are done here...
}

Мой сервис выглядит следующим образом

public interface EntityService {

   public void create(Entity<? extends Serializable> entity) throws ServiceException;
   public boolean delete(Entity<? extends Serializable> entity) throws ServiceException;
}

, и моя реализация находится в классе EntityServiceImpl.

При создании веб-службы с помощью Apache CXF я получаю следующее исключение:

Error: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.reflect.TypeVariable

java.lang.RuntimeException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.reflect.TypeVariable
    at org.apache.cxf.frontend.AbstractServiceFactory.createService(AbstractServiceFactory.java:41)
    at org.apache.cxf.tools.java2wsdl.processor.JavaToWSDLProcessor.process(JavaToWSDLProcessor.java:128)
    at org.apache.cxf.tools.java2ws.JavaToWSContainer.processWSDL(JavaToWSContainer.java:109)
    at org.apache.cxf.tools.java2ws.JavaToWSContainer.execute(JavaToWSContainer.java:75)
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:103)
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:58)
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:40)
    at org.apache.cxf.tools.java2ws.JavaToWS.run(JavaToWS.java:77)
    at org.apache.cxf.tools.java2ws.JavaToWS.main(JavaToWS.java:45)
Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.reflect.TypeVariable
    at org.apache.cxf.jaxb.JAXBContextInitializer.addType(JAXBContextInitializer.java:232)
    at org.apache.cxf.jaxb.JAXBContextInitializer.addType(JAXBContextInitializer.java:211)

Мой вопрос:

Как создать веб-службу с параметризованными типами или использоватьДженерики

1 Ответ

2 голосов
/ 02 августа 2010

Видя, что никто не ответил на этот вопрос, я сам отвечу на него.

В Apache CXF, сгенерированном компоненте WS, все получатели возвращают объект not null, что означает, что если переменная имеет значение null, то происходит следующее:

 public List<? extends User> getParents() {
        if (parents == null) {
            parents = new ArrayList<User>();
        }
        return this.parents;
    }

Как видите, следующее вызывает исключение для CXF:

  • Сериализуемый класс - это интерфейс, поэтому, если у меня есть переменная типа Serializable, new Serializable() не может быть определена, когда CXF генерирует исходный код клиента.
  • Весь объект должен реализовать конструктор public.

Отказ по двум принципам, вызывает исключение выше.


Решение

Для атрибута private List<? extends User> parents мы добавили это.

@XmlElements({ 
    @XmlElement(type=Man.class),
    @XmlElement(type=Female.class),
    @XmlElement(type=Child.class)
})
private List<? extends User> parents;

А для интерфейсов мы использовали XmlJavaTypeAdapter и написали адаптер для каждого реализованного подкласса этого интерфейса,

* 1 033 * например,
public class IntegerConstraintBaseAdapter extends XmlAdapter<IntegerConstraint, ConstraintBase<Integer>> {

    /* (non-Javadoc)
     * @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object)
     */
    @Override
    public IntegerConstraint marshal(ConstraintBase<Integer> v) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object)
     */
    @Override
    public ConstraintBase<Integer> unmarshal(IntegerConstraint v) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
}

Надеюсь, это кому-нибудь поможет.

...