有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java错误404:javax。servlet。不可用异常:SRVE0201E:Servlet[org.glassfish.jersey.Servlet.ServletContainer]:不是Servlet类

我们在WebSphere9中运行。我想让新泽西州的休息服务开始。使用Jersey 3.0.2。我应该注意到这里没有Maven,我必须以老式的方式获取所有依赖项,因为我的雇主不允许Maven(不要问,这是一个故事)。它启动,但在请求时,请求返回:

错误404:javax。servlet。不可用异常:SRVE0201E:Servlet[org.glassfish.jersey.Servlet.ServletContainer]:不是Servlet类

日志中没有错误。网络。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扩展了jakarta的servlet,而不是HttpServlet。但我在互联网上看到的例子都是这样声明ServletContainer,以便在其包和子包中启用注释扫描


共 (1) 个答案

  1. # 1 楼答案

    这可能是不可能的——或者至少充满了危险。WebSphereV9是围绕JavaEE7构建的,因此它使用Servlet3.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 stream(它构建在Jakarta EE 8上-仍然使用旧的javax.*包名),但即使这样也可能与WebSphere v9中的Java/Jakarta EE级别差异存在一些兼容性问题

    您还可以将应用服务器切换到支持Jakarta EE 9(目前处于测试阶段)的WebSphere Liberty。在本例中,您可以将内置JAX-RS实现(基于RESTEasy)与restfulWS-3.0特性结合使用,也可以在使用servlet-5.0特性时使用Jersey 3.0.2

    如果您需要继续使用WebSphereV9和Jersey 3.0.2,那么您将真正开创一条新的道路——但是您需要采取的方法是使用父类最后一个类加载方法,并且需要打包您自己的web容器。这种方法开始失去在应用程序服务器中部署的价值,但根据应用程序的其他部分,仍然可能有一些价值。如果可能的话,我会建议把自由作为最好的选择,或者换成泽西2号。第二名是X