Websphere Application Server Servlet初始化错误

时间:2015-04-21 08:53:06

标签: java web-services servlets websphere apache-wink

我们需要将在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。

在库source code(类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返回到映射到它的每个请求。

我不知道这种方法如何返回错误,我需要你的帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您的应用程序中捆绑了眨眼或平针织物或任何其他jaxrs库,请将其删除。

答案 2 :(得分:0)

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

1)从应用程序li​​b文件夹中删除所有apache wink jar。

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

3)使用这些罐子建立您的应用程序,但不要将这些罐子包装进去    你的申请EAR或WAR。

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

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