[英]Websphere Application Server Servlet Initialization Error
我们需要将在Glassfish上运行的应用迁移到Websphere Application Server(WAS)8.5.x版本。
为了看到通过简单的设置一切正常,我创建了一个带有单个rest服务的示例项目。
我没有使用自己的类扩展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,因此需要您的帮助。
您的应用程序一定有问题,也许您有一些冲突的库。
我的课很简单:
@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
如果您的应用程序中捆绑了眨眼或运动衫或任何其他jaxrs库,请将其删除。
当我从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,那么请确保所有宁静的资源和扩展Application类的类都是战争的一部分。
5)重新部署您的应用程序,现在应该可以正常工作了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.