我们在Websphere 9中运行,我正在尝试建立一个基于Jersey的REST服务。使用Jersey 3.0.2。我应该指出的是,这里没有涉及Maven,我必须以老式的方式获取所有依赖项,因为我的雇主不允许Maven (不要问,这是一个故事)。它会启动,但在请求时,请求会返回:
错误404: javax.servlet.UnavailableException: SRVE0201E: Servlet servlet不是servlet类
日志中没有错误。web.xml为:
<servlet>
<servlet-name>CCFService</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>pkg.ccf.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CCFService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>服务pojo:
@Path("/review")
public class Review {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, Object> list() {
//omitted because it's irrelevant, control never gets here
}
}我正在点击的url (尽管我已经尝试过各种变体):
http://localhost:9080/CCFPortal/review/list
我发现ServletContainer扩展了雅加达的servlet,而不是HttpServlet。但我在互联网上到处都可以看到这样声明ServletContainer的例子,以便在它们的包和子包中启用注释扫描。
发布于 2021-09-16 15:10:20
这可能是不可能的--或者至少充满了危险。WebSphere v9是围绕JavaEE7构建的,因此它提供了一个使用Servlet3.1规范的web容器。Jersey 3.0.2依赖于Jakarta EE 9 (Servlet 5.0)。不同之处不仅仅在于它们之间添加了新特性--还有包的重构,所以WebSphere容器期望用户应用程序中的所有servlet都能扩展javax.servlet.http.HttpServlet,而Jersey3.0.2的ServletContainer class扩展了jakarta.servlet.http.HttpServlet。
您可能会改用Jersey的2.X流(它构建在Jakarta EE 8上-仍然使用旧的javax.*包名称),但即使这样也可能与WebSphere v9中的javax.*/Jakarta EE级别差异存在一些兼容性问题。
您还可以将应用服务器切换到支持Jakarta EE 9(当前处于测试版)的WebSphere自由。在这种情况下,您可以使用内置的JAX-RS实现(基于RESTEasy)和restfulWS-3.0特性,或者在使用servlet-5.0特性时使用Jersey3.0.2。
如果你需要继续使用WebSphere v9和Jersey3.0.2,那么你真的是在开辟一条新路--但你需要采取的方法是使用父类加载方法,并且你需要打包自己的web容器。这种方法开始失去在应用程序服务器中部署的价值,但仍然可能有一些价值,这取决于应用程序的其他部分。如果可能的话,我会建议切换到Liberty作为最好的选择,或者切换到Jersey 2.X作为次佳选择。
https://stackoverflow.com/questions/69209932
复制相似问题