首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java (Apache CXF,Axis 2)中的参数化类生成Web服务(WSDL 1.2或更高版本)

从Java (Apache CXF,Axis 2)中的参数化类生成Web服务(WSDL 1.2或更高版本)
EN

Stack Overflow用户
提问于 2010-07-30 02:49:40
回答 1查看 2.6K关注 0票数 2

我有一个抽象类,如下所示。

代码语言:javascript
复制
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...
}

我的服务如下所示

代码语言:javascript
复制
public interface EntityService {

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

我的实现是在类EntityServiceImpl上实现的。

当我使用Apache CXF生成Web服务时,我得到以下异常:

代码语言:javascript
复制
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)

我的问题是:

如何生成具有参数化类型或使用泛型的Web服务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-02 22:44:33

鉴于没有人回答这个问题,我将自己回答这个问题。

使用Apache CXF ( WS生成的bean ),所有的getter都会返回一个not null对象,这意味着如果一个变量为null,将会发生以下情况:

代码语言:javascript
复制
 public List<? extends User> getParents() {
        if (parents == null) {
            parents = new ArrayList<User>();
        }
        return this.parents;
    }

如您所见,这会导致CXF出现异常:

  • 可序列化的类是一个接口,所以如果我有一个Serializable类型的变量,当CXF生成客户端source-code.
  • All对象时,不能定义Serializablenew Serializable() 必须实现一个public对象

这两个原则失败,会导致上述异常。

解决方案

对于属性private List<? extends User> parents,我们添加了以下内容。

代码语言:javascript
复制
@XmlElements({ 
    @XmlElement(type=Man.class),
    @XmlElement(type=Female.class),
    @XmlElement(type=Child.class)
})
private List<? extends User> parents;

对于接口,我们使用XmlJavaTypeAdapter并为该接口的每个实现的子类编写了一个适配器,

例如:

代码语言:javascript
复制
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;
    }
}

希望这对某些人有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3365962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档