Java Websphere Application Server Servlet初始化错误
我们需要将运行在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中,有如下部分: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映射访问服务 当
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。