2012-02-23 54 views
5

我们使用cxf 2.5.2和spring一起公开和使用平静的服务。 分发服务接口类,我们开始使用wadl2java目标(其基于给定的WADL文件接口的类)CXF JAXRS |在生成的wadl中不存在复杂的响应类型

生成WADL犯规包含正确的响应类型,因为其中的我猜,生成的接口都有'Response'作为返回类型。

Ex。如果宁静get方法返回“名单”,生成WADL只包含以下部分:

<response><representation mediaType="application/json"/></response>

,并从该WADL文件生成相应的接口包含返回类型为“响应”

灿有人建议需要做些什么来防止实际响应类型丢失? 是否有任何注释(如ElementClass?如何使用它?)或提供者需要?

当前代码:

@GET 
@Path("/itemsForCategory") 
@Produces("application/json") 
@Description("getItemsForCategory") 
public List<Item> getItemsForCategory(@QueryParam("category")String category) { 
+0

找到http://cxf.547215.n5.nabble.com/Problem-with-WADL-generation-and-returning-a-List-of-objects-td4713351.html#a5507490。不知道它是否已被修复 – crankparty 2012-02-23 12:23:57

回答

-1

与列表,地图等处理因为集合不生成WSDL,你投入的集合类型都被忽略,当在运行时知道自己的类型,当我有类似的问题。我发现,这个例外是另一个Web服务公开方法使用该特定类型。作为解决方案,我创建了一个虚拟方法,使用列表和地图所需的每种类型。

因此,例如,我有一个名为User的类,它扩展了一个名为BaseObject的抽象类,该类没有被webservice直接使用。但是,搜索用户时有时会通过列表。以下代码是我的解决方法。

@WebService 
public interface MyService 
{ 
    // Various @WebMethods here 

    /** 
    * This method should not be used. This is a workaround to ensure that 
    * User is known to the JAXB context. Otherwise you will get exceptions like this: 
    * javax.xml.bind.JAXBException: class java.util.User nor any of its super class is known to this context. 
    * Or it will assume that using BaseObject is OK and deserialisation will fail 
    * since BaseObject is abstract. 
    * This issue occurs because the classes available to the JAXB context 
    * are loaded when the endpoint is published. At that time it is not known 
    * that User will be needed since it is not explicitly referenced 
    * in any of these methods. Adding user here will cause it to be added to 
    * the context. 
    * @param user 
    * @return 
    */ 
    @WebMethod 
    void dummy(@WebParam(name="user") User user); 
} 

我承认这是一个有点讨厌工作的周围,我不认为这是一个适当的修复,但也许它会让你走,直到有人能提供更好的解决方案。

希望这会有所帮助。

2

泛型“Response”返回类型似乎与您试图返回列表的事实无关。也就是说,即使使用“Item”作为返回类型,也会在生成的接口中产生一个返回类型为“Response”的方法。为了解决这个问题,你需要添加的元素属性在WADL资源响应:

<response><representation mediaType="application/json" element="item"/></response> 

,如果你直接修改WADL,这工作等效JAX-RS注解可能会或可能不被支持。这也不能解决您返回列表的问题。我的建议(我以前使用过)是创建封装列表返回类型的封装列表类型(例如ItemList)。

在任何一种情况下,您都需要从底部向上翻转(即先执行WADL)。这应该不会太糟糕,因为你已经有了实现,你可以让它实现生成的接口。为了阐明所有这些,我做了一个基于标准JAX-RS“书店”示例的简单示例项目。您可以在github上查看pom(使用wadl2java配置)和实际的wadl。生成的代码也在那里(例如,BookstoreidResource.java)。

+0

回购不再存在 – 2017-01-26 16:48:22