Spring 6 和 Jersey 3 -> 404 未找到

问题描述 投票:0回答:1

我正在从 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) [?:?]

谁能告诉我如何解决吗?

java spring spring-mvc jersey spring-jersey
1个回答
1
投票

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 迁移指南,其中简要提到了这一点以及其他已更改并可能影响您的内容。

© www.soinside.com 2019 - 2024. All rights reserved.