错误 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 不工作

如何设置404页面,404错误页面自定义方法

404错误文档问题

网站地址/404.html 的返回状态值是200,其他错误页面是404?

NGINX 配置404错误页面转向

如何使用 Codeigniter 在自定义 404 页面中重定向 404 错误?