5

我们使用 cxf 2.5.2 和 spring 来暴露和使用 restful 服务。为了分发服务接口类,我们开始使用 wadl2java 目标(根据给定的 wadl 文件生成接口类)

生成的 wadl 不包含正确的响应类型,因此我猜,生成的接口都具有“响应”作为返回类型。

前任。如果 restful get 方法返回 'List' ,则生成的 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) {
4

2 回答 2

2

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

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

如果您直接修改 WADL,则此方法有效,可能支持也可能不支持等效的 JAX-RS 注释。这也不能解决您返回列表的问题。我的建议(我以前使用过)是创建一个封装列表返回类型的包装器列表类型(例如 ItemList)。

在任何一种情况下,您都需要从自下而上翻转到自上而下(即,首先是 WADL)实现。这应该不会太糟糕,因为你已经有了实现,你可以让它实现生成的接口。

为了澄清这一切,我基于标准的 JAX-RS“书店”示例制作了一个简单的示例项目。您可以在 github 上查看pom(使用 wadl2java 配置)和实际的wadl。生成的代码也在那里(例如,BookstoreidResource.java)。

于 2012-03-25T23:43:11.247 回答
-1

在处理列表、地图等时,我遇到了类似的问题。因为在生成 WSDL 时集合在运行时不知道它们的类型,所以您放入集合中的类型将被忽略。我发现,例外情况是当另一个 Web 服务公开方法使用该特定类型时。作为一种解决方法,我创建了一个虚拟方法,该方法使用了列表和地图所需的每种类型。

例如,我有一个名为 User 的类,它扩展了一个名为 BaseObject 的抽象类,Web 服务不直接使用它。但是,有时在搜索用户时会通过列表传递。以下代码是我的解决方法。

@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);
}

我承认这是一个有点讨厌的工作,我不认为这是一个适当的解决方案,但也许它会让你继续前进,直到有人可以提供更好的解决方案。

希望这可以帮助。

于 2012-03-14T00:28:04.007 回答