错误 404:javax.servlet.UnavailableException:SRVE0201E:Servlet [org.glassfish.jersey.servlet.ServletCon
Posted
技术标签:
【中文标题】错误 404:javax.servlet.UnavailableException:SRVE0201E:Servlet [org.glassfish.jersey.servlet.ServletContainer]:不是 servlet 类【英文标题】:Error 404: javax.servlet.UnavailableException: SRVE0201E: Servlet [org.glassfish.jersey.servlet.ServletContainer]: not a servlet class 【发布时间】:2021-11-11 12:51:01 【问题描述】:我们在 Websphere 9 中运行。我正在尝试运行基于 Jersey 的 REST 服务。使用泽西岛 3.0.2。我应该注意这里没有涉及 Maven,我必须以老式的方式获取所有依赖项,因为我的雇主不允许 Maven(不要问,这是一个故事)。它启动了,但根据请求,请求返回:
日志中没有错误。 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>
服务点:
@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
我正在点击的网址(尽管我尝试过变体):
http://localhost:9080/CCFPortal/review/list
我查看了 ServletContainer 扩展了 jakarta 的 servlet,而不是 HttpServlet。但是我在互联网上看到了这样的例子,声明 ServletContainer 以在它们的包和子包中启用注释扫描。
【问题讨论】:
【参考方案1】:这可能是不可能的——或者至少充满了危险。 WebSphere v9 是围绕 Java EE 7 构建的,因此它提供了一个使用 Servlet 3.1 规范的 Web 容器。 Jersey 3.0.2 依赖于 Jakarta EE 9 (Servlet 5.0)。不同之处不仅仅是在两者之间添加了新特性——还对包进行了重构,因此 WebSphere 的 Web 容器期望用户应用程序中的所有 servlet 扩展 javax.servlet.http.HttpServlet
,但 Jersey 3.0.2 的 ServletContainer class 扩展了 jakarta.servlet.http.HttpServlet
.
您可能会切换到使用 Jersey 的 2.X 流(基于 Jakarta EE 8 构建 - 仍然使用旧的 javax.*
包名称),但即使这样也可能与 Java/Jakarta EE 级别差异存在一些兼容性问题在 WebSphere v9 中。
您还可以将应用服务器切换到支持 Jakarta EE 9(当前处于 Beta 版)的 WebSphere Liberty。在这种情况下,您可以使用带有 restfulWS-3.0
功能的内置 JAX-RS 实现(基于 RESTEasy) - 或者您可以在使用 servlet-5.0
功能时使用 Jersey 3.0.2。
如果您需要继续使用 WebSphere v9 和 Jersey 3.0.2,那么您将真正开辟一条新道路 - 但您需要采用的方法是使用 parent-last 类加载方法,并且您需要打包您自己的 Web 容器。这种方法开始失去在应用程序服务器中部署的价值,但仍然可能有一些价值,具体取决于应用程序的其他部分。如果可能的话,我建议切换到 Liberty 作为最佳选择,或者切换到 Jersey 2.X 作为次佳选择。
【讨论】:
以上是关于错误 404:javax.servlet.UnavailableException:SRVE0201E:Servlet [org.glassfish.jersey.servlet.ServletCon的主要内容,如果未能解决你的问题,请参考以下文章
HTACCESS 错误文档 404 /404.htm 不工作