我们需要将在 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。
在库源代码(类 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,我需要你的帮助。