从 Java 中的参数化类生成 Web 服务(WSDL 1.2 或更高版本)(Apache CXF、Axis 2)
我有一个抽象类,如下所示。
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 生成 Web 服务时,出现以下异常:
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 服务?
I have an abstract class that looks as follows.
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...
}
My Service looks like this
public interface EntityService {
public void create(Entity<? extends Serializable> entity) throws ServiceException;
public boolean delete(Entity<? extends Serializable> entity) throws ServiceException;
}
and my implementation is on class EntityServiceImpl
.
When I do a Web Service generation with Apache CXF, I get the following exception:
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)
My question:
How do I generate a Web Service that has Parametrized Types or uses Generics?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看到没有人回答这个问题,我就自己回答一下吧。
对于 Apache CXF(WS 生成的 bean),所有 getter 都会返回一个
not null
对象,这意味着如果变量为 null,则会发生以下情况:如您所见,以下内容会导致 CXF 出现异常:
Serialized
类型的变量,则在 CXF 生成客户端源代码时无法定义new Serialized()
。public
构造函数。不满足这两个原则,会导致上述异常。
解决方案
对于属性
私有列表父母,我们添加了这个。
对于接口,我们使用
XmlJavaTypeAdapter
并为该接口的每个实现的子类编写一个适配器,例如
希望这对某人有帮助。
Seeing that nobody answered this question, I'll answer this myself.
With Apache CXF, A WS generated bean, all getters return a
not null
object, meaning that if a variable is null, this is what happens:As you can see, this following causes an exception for CXF:
Serializable
,new Serializable()
cannot be defined when CXF generates client source-code.public
constructor.Failure for the 2 principles, causes the exception above.
Solution
For attribute
private List<? extends User> parents
, we added this.And for interfaces, we used the
XmlJavaTypeAdapter
and wrote an adapter for every implemented subclasses of that interface,e.g.
Hope this helps someone.