首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误404: javax.servlet.UnavailableException: SRVE0201E: Servlet servlet不是servlet类

错误404: javax.servlet.UnavailableException: SRVE0201E: Servlet servlet不是servlet类
EN

Stack Overflow用户
提问于 2021-09-16 14:04:37
回答 1查看 183关注 0票数 0

我们在Websphere 9中运行,我正在尝试建立一个基于Jersey的REST服务。使用Jersey 3.0.2。我应该指出的是,这里没有涉及Maven,我必须以老式的方式获取所有依赖项,因为我的雇主不允许Maven (不要问,这是一个故事)。它会启动,但在请求时,请求会返回:

错误404: javax.servlet.UnavailableException: SRVE0201E: Servlet servlet不是servlet类

日志中没有错误。web.xml为:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
@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的例子,以便在它们的包和子包中启用注释扫描。

EN

回答 1

Stack Overflow用户

发布于 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作为次佳选择。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69209932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档