Java Websphere Application Server Servlet初始化错误

Java Websphere Application Server Servlet初始化错误,java,web-services,servlets,websphere,apache-wink,Java,Web Services,Servlets,Websphere,Apache Wink,我们需要将运行在Glassfish上的应用程序迁移到WebSphereApplicationServer WAS 8.5.x版本 为了通过一个简单的设置确保工作正常,我创建了一个带有单个rest服务的示例项目 我没有用自己的类扩展javax.ws.rs.core.Application,我只有一个带有路径注释的类。我在web.xml中定义了一个名为javax.ws.rs.core.Application的servlet,这样就可以扫描注释,并且可以通过给定的servlet url映射访问服务 当

我们需要将运行在Glassfish上的应用程序迁移到WebSphereApplicationServer WAS 8.5.x版本

为了通过一个简单的设置确保工作正常,我创建了一个带有单个rest服务的示例项目

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

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

在库类DefaultLifecycleManager中,有如下部分:

79        if (ApplicationMetadataCollector.isApplication(cls)) {
80            // by default application subclasses are singletons
81            return LifecycleManagerUtils.createSingletonObjectFactory(cls);
82        }
isApplicationcls方法应返回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,我需要您的帮助。

您的应用程序一定出了问题,可能您有一些相互冲突的库

我有非常简单的课程:

@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

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

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

1从应用程序库文件夹中删除所有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打包到 您的应用程序可能会导致灾难或战争

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


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

检查web.xml是否为3.0版本。如果您在服务器和应用程序启动期间有任何异常,也可以查看SystemOut.log。是的,web.xml是3.0版。如果我没有用我的扩展应用程序类,它也不会打印任何异常。如果我扩展它,行为将保持不变,它将打印一个指向我上面解释的类的堆栈跟踪。在通过调用isApplicationcls方法的createObjectFactory方法创建对象工厂失败后,引发的异常随后在DefaultLifecycleManager上引发IllegalArgumentException。我尝试了它,但得到了错误:名为[javax.ws.rs.core.Application]的servlet的servlet类名为null因此,请求不能被删除handled@MahmoudSaleh您的web.xml版本可能太旧。确保它是3.x。