我正在从 Spring 5 迁移到 Spring 6.0.13,但在使用 Jersey 3.1.1 时遇到问题。
在 WebInitializer 中:
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
var webApplicationContext = new AnnotationConfigWebApplicationContext();
webApplicationContext.register(this.createContextConfig());
webApplicationContext.setServletContext(servletContext);
servletContext.addListener(new ContextLoaderListener(webApplicationContext));
var dispatcherServlet = new DispatcherServlet(webApplicationContext);
ServletRegistration.Dynamic theDispatcherServlet =
servletContext.addServlet("dispatcherServlet", dispatcherServlet);
theDispatcherServlet.setLoadOnStartup(1);
theDispatcherServlet.addMapping("/*");
ServletRegistration.Dynamic jerseyRegistration = servletContext.addServlet("jerseyServlet",
"org.glassfish.jersey.servlet.ServletContainer");
jerseyRegistration.setInitParameter("javax.ws.rs.Application", RestApplication.class.getName());
jerseyRegistration.setInitParameter("jersey.config.server.provider.packages",
JerseyGsonProvider.class.getPackageName());
jerseyRegistration.setInitParameter("jersey.config.server.wadl.disableWadl", "true");
jerseyRegistration.addMapping("/rest/*");
jerseyRegistration.setLoadOnStartup(1);
}
....
}
休息申请:
@ApplicationPath("rest")
public class RestApplication extends ResourceConfig {
public RestApplication() {
registerClasses(FooResource.class);
register(new LoggingFeature(Logger.global.getLogger("JerseyLogger"),
Level.FINE, LoggingFeature.Verbosity.PAYLOAD_ANY, 8192));
System.out.println("CLASSES REGISTERED IN JERSEY");//THIS MESSAGE IS NEVER PRINTED
}
}
Foo资源:
@Path("/foo")
public class FooResource {
@GET
@Produces(MediaType.TEXT_HTML)
@Path("/temp")
public String temp() {
return "<body>Hello! This is temp rest</body>";
}
}
当我打开 http://127.0.0.1:8080/rest/foo/temp 我得到:
HTTP ERROR 404 Not Found
URI: /rest/foo/temp
STATUS: 404
MESSAGE: Not Found
SERVLET: jerseyServlet
Powered by Jetty:// 12.0.3
日志:
jakarta.ws.rs.NotFoundException: HTTP 404 Not Found
at [email protected]/org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:258) [jersey-server-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.internal.Errors$1.call(Errors.java:248) [jersey-common-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.internal.Errors$1.call(Errors.java:244) [jersey-common-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.internal.Errors.process(Errors.java:292) [jersey-common-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.internal.Errors.process(Errors.java:274) [jersey-common-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.internal.Errors.process(Errors.java:244) [jersey-common-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265) [jersey-common-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:240) [jersey-server-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:697) [jersey-server-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394) [jersey-container-servlet-core-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346) [jersey-container-servlet-core-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:357) [jersey-container-servlet-core-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:311) [jersey-container-servlet-core-3.1.1.jar:?]
at [email protected]/org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205) [jersey-container-servlet-core-3.1.1.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1370) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1609) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.websocket.servlet.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:195) [jetty-ee10-websocket-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:205) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1581) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1542) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:886) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:491) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:463) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:571) [jetty-security-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:693) [jetty-ee10-servlet-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:809) [jetty-server-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.server.Server.handle(Server.java:179) [jetty-server-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:649) [jetty-server-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:471) [jetty-server-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322) [jetty-io-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100) [jetty-io-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53) [jetty-io-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:971) [jetty-util-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1196) [jetty-util-12.0.3.jar:?]
at [email protected]/org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1151) [jetty-util-12.0.3.jar:?]
at java.base/java.lang.Thread.run(Thread.java:833) [?:?]
谁能告诉我如何解决吗?
Spring 6 基于 JakartaEE(而不是 JavaEE)。由于应用程序启动时没有关于未找到的类/不兼容的类的警告/错误,我假设使用的 Jersey 版本与 JakartaEE 兼容。
但是您的配置仍然反映旧的 JavaEE 配置。
jerseyRegistration.setInitParameter("javax.ws.rs.Application", RestApplication.class.getName());
应该是
jerseyRegistration.setInitParameter("jakarta.ws.rs.Application", RestApplication.class.getName());
这应该可以帮助你开始。您可能还想查看 Jersey 迁移指南,其中简要提到了这一点以及其他已更改并可能影响您的内容。