我们需要将在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返回到映射到它的每个请求。
我不知道这种方法如何返回错误,我需要你的帮助。
答案 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)从应用程序lib文件夹中删除所有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)重新部署您的应用程序,现在应该可以正常工作。