Spring6、Jersey3、Jetty12、严重:Spring 上下文查找失败,跳过 Spring 组件提供程序初始化

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

我有一个 java 21 spring6 框架(不是启动)应用程序。该应用程序是一个简单的嵌入式 Web 服务器,使用 jetty 12 作为服务器,并使用 jersey 3 作为资源处理程序。有用。我已经编写了集成测试,可以启动服务器并通过放心的客户端调用来访问一些端点。它们工作完美。

我一生都无法弄清楚如何摆脱这个错误:

Nov 09, 2024 9:05:22 PM org.glassfish.jersey.server.spring.SpringComponentProvider initialize
SEVERE: Spring context lookup failed, skipping spring component provider initialization.

我已经尝试了我能想到的所有注册和属性设置组合。我怎样才能告诉泽西“这是你的春天背景;停止抱怨。”

这是我的代码:

    public int startServer(int port) throws Exception {
        this.context = new AnnotationConfigApplicationContext(AppConfig.class);

        ResourceConfig rc = new ResourceConfig()
                .packages("com.example.resources")
                .register(JerseyLoggingFilter.class)
                .property(ServerProperties.PROCESSING_RESPONSE_ERRORS_ENABLED, true);

        InetSocketAddress bindAddr = new InetSocketAddress(BIND_ADDR, port);
        this.server = new Server(bindAddr);
        ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
        contextHandler.setContextPath("/");
        ServletHolder servletHolder = new ServletHolder(new ServletContainer(rc));
        contextHandler.addServlet(servletHolder, "/*");
        this.server.setHandler(contextHandler);
        this.server.start();
        port = ((ServerConnector) server.getConnectors()[0]).getLocalPort();
        log.info("server listening on port " + port);
        return port;
    }
spring jersey jetty
1个回答
0
投票

感谢@M.Deinum 的评论 - 它引导我找到了解决方案:

    public int startServer(int port) throws Exception {
        this.context = new AnnotationConfigWebApplicationContext();
        this.context.register(AppConfig.class);

        ResourceConfig rc = new ResourceConfig()
                .packages("com.primarydata.proxy")
                .register(JerseyLoggingFilter.class)
                .property(ServerProperties.PROCESSING_RESPONSE_ERRORS_ENABLED, true);

        InetSocketAddress bindAddr = new InetSocketAddress(BIND_ADDR, port);
        this.server = new Server(bindAddr);
        ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
        contextHandler.addEventListener(new ContextLoaderListener(context));
        contextHandler.setContextPath("/");
        ServletHolder servletHolder = new ServletHolder(new ServletContainer(rc));
        contextHandler.addServlet(servletHolder, "/*");
        this.server.setHandler(contextHandler);
        this.server.start();

        int actualPort = ((ServerConnector) server.getConnectors()[0]).getLocalPort();
        return actualPort;
    }

需要注意的是,一旦 Web 应用程序上下文已注册到 Jetty 服务器,就不再需要对其调用 stop 了。调用 server.stop() 就足够了。

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