Jersey 2 和 Jetty:检测到未知的 HK2 故障
Jersey 2 and Jetty: Unknown HK2 failure detected
我正在尝试使用 Jersey 和 Jetty 编写 REST 应用程序。
堆栈:Java11,Gradle6.1.1,Jersey 2.30,Hibernate 5.4.X,9.4.26.v20200117 版本中的 Jetty 服务器和 servlet。
问题出现在 HK2 注入依赖的时候。这是一个错误日志:
Feb 11, 2020 10:49:41 PM org.glassfish.jersey.internal.Errors logErrors
WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2
java.lang.ExceptionInInitializerError
...
这里是主要的 Jetty class:
package com.familybank;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.servlet.ServletContainer;
public class Application {
public static void main(String[] args) {
// Jersey
final var servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
final var jerseyServletContainer = new ServletContainer(new ApplicationResourceConfiguration());
final var jerseyServletHolder = new ServletHolder(jerseyServletContainer);
servletContextHandler.setContextPath("/");
servletContextHandler.addServlet(jerseyServletHolder, "/api/*");
// Wire up Jetty
final var handlerList = new HandlerCollection();
handlerList.setHandlers(new Handler[]{ servletContextHandler });
final var server = new Server(8080);
server.setHandler(handlerList);
/*
final var uri = UriBuilder.fromUri("http://localhost/").port(8080).build();
final var server = JettyHttpContainerFactory.createServer(uri, new ApplicationResourceConfiguration());
*/
try {
server.start();
server.join();
} catch (Exception ex) {
// logger.error("Error occurred while starting Jetty", ex);
System.exit(1);
} finally {
server.destroy();
}
}
}
还有 ApplicationBinder:
public class ApplicationBinder extends AbstractBinder {
@Override
protected void configure() {
// DAO dependency injection
bind(UserDAO.class).to(UserDAO.class);
bind(PasswordDAO.class).to(PasswordDAO.class);
bind(RoleDAO.class).to(RoleDAO.class);
// Service dependency injection
bind(UserServiceImpl.class).to(UserService.class);
}
}
以及 ApplicationResourceConfiguration:
public class ApplicationResourceConfiguration extends ResourceConfig {
public ApplicationResourceConfiguration() {
// register(UserController.class); // With or without the result is the same
register(new ApplicationBinder());
packages(true, "com.example");
// register(UserController.class);
}
}
此外,UserController 看起来像:
@Path("/user")
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
private final UserService userService;
@Inject
public UserController(UserService userService) {
this.userService = userService;
}
@GET
@Path("/get-all")
@Produces(MediaType.APPLICATION_JSON)
public User getAll() {
logger.debug("GET /user/get-all");
return userService.getByLogin("some.user@example.com").orElseGet(User::new);
}
}
UserServiceImpl 使用 RoleDAO、PasswordDAO 和 UserDAO。 DAO classes 使用 EntityManagerFactory 进入数据库。
EntityManagerFactoryProvider class:
public class EntityManagerFactoryProvider {
private static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("family-bank");
public static EntityManagerFactory getEntityManagerFactory() {
return entityManagerFactory;
}
}
项目还包含 persistance.xml 配置 - 它适用于其他项目,所以应该没问题。
最奇怪的是,当我从 IntelliJ 运行 项目时,它运行良好。 Jar 构建和 运行 没有任何操作看起来也不错,但是当我从网络浏览器调用 url 时,楼梯出现了:http://localhost:8080/api/user/get-all
然后 HK2 依赖注入失败。我不知道出了什么问题。
如果有人需要,我可以发送异常的整个堆栈跟踪(没有把它放在那里,因为它的长度......)。
如何配置 Jersey 2 和 Jetty 以在所述情况下工作?
解决方案是迁移到 Tomcat。
我正在尝试使用 Jersey 和 Jetty 编写 REST 应用程序。 堆栈:Java11,Gradle6.1.1,Jersey 2.30,Hibernate 5.4.X,9.4.26.v20200117 版本中的 Jetty 服务器和 servlet。 问题出现在 HK2 注入依赖的时候。这是一个错误日志:
Feb 11, 2020 10:49:41 PM org.glassfish.jersey.internal.Errors logErrors
WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2
java.lang.ExceptionInInitializerError
...
这里是主要的 Jetty class:
package com.familybank;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.servlet.ServletContainer;
public class Application {
public static void main(String[] args) {
// Jersey
final var servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
final var jerseyServletContainer = new ServletContainer(new ApplicationResourceConfiguration());
final var jerseyServletHolder = new ServletHolder(jerseyServletContainer);
servletContextHandler.setContextPath("/");
servletContextHandler.addServlet(jerseyServletHolder, "/api/*");
// Wire up Jetty
final var handlerList = new HandlerCollection();
handlerList.setHandlers(new Handler[]{ servletContextHandler });
final var server = new Server(8080);
server.setHandler(handlerList);
/*
final var uri = UriBuilder.fromUri("http://localhost/").port(8080).build();
final var server = JettyHttpContainerFactory.createServer(uri, new ApplicationResourceConfiguration());
*/
try {
server.start();
server.join();
} catch (Exception ex) {
// logger.error("Error occurred while starting Jetty", ex);
System.exit(1);
} finally {
server.destroy();
}
}
}
还有 ApplicationBinder:
public class ApplicationBinder extends AbstractBinder {
@Override
protected void configure() {
// DAO dependency injection
bind(UserDAO.class).to(UserDAO.class);
bind(PasswordDAO.class).to(PasswordDAO.class);
bind(RoleDAO.class).to(RoleDAO.class);
// Service dependency injection
bind(UserServiceImpl.class).to(UserService.class);
}
}
以及 ApplicationResourceConfiguration:
public class ApplicationResourceConfiguration extends ResourceConfig {
public ApplicationResourceConfiguration() {
// register(UserController.class); // With or without the result is the same
register(new ApplicationBinder());
packages(true, "com.example");
// register(UserController.class);
}
}
此外,UserController 看起来像:
@Path("/user")
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
private final UserService userService;
@Inject
public UserController(UserService userService) {
this.userService = userService;
}
@GET
@Path("/get-all")
@Produces(MediaType.APPLICATION_JSON)
public User getAll() {
logger.debug("GET /user/get-all");
return userService.getByLogin("some.user@example.com").orElseGet(User::new);
}
}
UserServiceImpl 使用 RoleDAO、PasswordDAO 和 UserDAO。 DAO classes 使用 EntityManagerFactory 进入数据库。
EntityManagerFactoryProvider class:
public class EntityManagerFactoryProvider {
private static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("family-bank");
public static EntityManagerFactory getEntityManagerFactory() {
return entityManagerFactory;
}
}
项目还包含 persistance.xml 配置 - 它适用于其他项目,所以应该没问题。
最奇怪的是,当我从 IntelliJ 运行 项目时,它运行良好。 Jar 构建和 运行 没有任何操作看起来也不错,但是当我从网络浏览器调用 url 时,楼梯出现了:http://localhost:8080/api/user/get-all
然后 HK2 依赖注入失败。我不知道出了什么问题。 如果有人需要,我可以发送异常的整个堆栈跟踪(没有把它放在那里,因为它的长度......)。
如何配置 Jersey 2 和 Jetty 以在所述情况下工作?
解决方案是迁移到 Tomcat。