0

我们需要将在 Glassfish 上运行的应用程序迁移到 Websphere Application Server (WAS) 8.5.x 版本。

为了通过简单的设置查看一切是否正常,我创建了一个带有单个休息服务的示例项目。

我没有用自己的类扩展 javax.ws.rs.core.Application ,我只有一个带有路径注释的类。我在 web.xml 中定义了一个名为“javax.ws.rs.core.Application”的 servlet,以便扫描注释,并且可以从给定的 servlet url 映射访问服务。

当我尝试访问该服务时,我收到一条 404 消息。但真正的问题是标准 IBM Websphere 库附带的 Apache Wink。

在库源代码(类 DefaultLifecycleManager)中,有这样的部分:

79        if (ApplicationMetadataCollector.isApplication(cls)) {
80            // by default application subclasses are singletons
81            return LifecycleManagerUtils.createSingletonObjectFactory(cls);
82        }

isApplication (cls)方法应该返回 true,然后应该为其创建单例工厂。但是,它返回 false。该方法的主体如下:

76    public static boolean More ...isApplication(Class cls) {
77        return Application.class.isAssignableFrom(cls);
78    }

我在那里放了一个断点并检查了值。cls 就是 javax.ws.rs.core.Application,就是第 77 行的同一个类。

这会导致 servlet 无法正确启动,并向映射到它的每个请求返回 404。

我不知道这个方法如何返回false,我需要你的帮助。

4

3 回答 3

0

如果您的应用程序中捆绑了 wink 或 jersey 或任何其他 jaxrs 库,请将其删除。

于 2015-04-21T16:37:39.827 回答
0

您的应用程序一定有问题,也许您有一些冲突的库。

我有非常简单的课程:

@Path("/HelloRest")
public class Hello {

    @GET
    public String hello() {
        System.out.println("Rest called");
        return "Hello  " + new Date();
    }
}

使用以下web.xml,在 WAS 8.5.5 上启动并正常工作:

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

被叫时http://localhost:9080/JAXRSTestWeb/rest/HelloRest

于 2015-04-21T15:47:37.130 回答
0

当我从WAS 7.0 迁移到 WAS 8.5时,我最近做了几乎同样的事情。WAS 8.5 带有内置的 Apache Wink 1.1。您可以按照以下步骤在 WAS 8.5 上迁移您的应用程序:

1) 从您的应用程序 lib 文件夹中删除所有 apache wink jar。

2) 要构建您的应用程序,您可以使用这两个 websphere jar,com.ibm.ws.prereq.jaxrs.jar 和 com.ibm.ws.prereq.jackson.jar。您可以在WAS_HOME/plugins文件夹中找到这些 jar 。

3) 使用这些 jar 构建您的应用程序,但不要将这些 jar 打包到您的应用程序 EAR 或 WAR 中。

4)如果您的应用程序类型是EAR,那么请确保所有restful资源和扩展Application类的类都是战争的一部分。

5)重新部署您的应用程序,它现在应该可以正常工作了。

于 2015-05-15T19:39:28.153 回答