我有一个 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;
}
感谢@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() 就足够了。