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 楼答案
这可能是不可能的——或者至少充满了危险。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