【问题标题】:Jersey 2 and Jetty: Unknown HK2 failure detectedJersey 2 和 Jetty:检测到未知的 HK2 故障
【发布时间】:2020-05-27 09:28:23
【问题描述】:

我正在尝试使用 Jersey 和 Jetty 编写一个 REST 应用程序。 堆栈:Java 11、Gradle 6.1.1、Jersey 2.30、Hibernate 5.4.X、Jetty 服务器和 9.4.26.v20200117 版本中的 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 主类:

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 类使用 EntityManagerFactory 进入数据库。

EntityManagerFactoryProvider 类:

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 以在所述情况下工作?

【问题讨论】:

  • 您可能希望在 HK 失败时包含两个堆栈跟踪。
  • 堆栈跟踪真的很长(2156 行)。链接到跟踪:paste.ofcode.org/34xBccxdkNZaana69FNUuhv
  • java.lang.NoClassDefFoundError: Could not initialize class com.example.configuration.EntityManagerFactoryProvider。你在那个类中有一个静态初始化器吗?你能展示一下吗?在此初始化过程中似乎出了点问题。
  • @PaulSamsotha - 我编辑了一个添加 EntityManagerFactoryProvider 的问题。有由 Persistence.createEntityManagerFactory(...) 方法初始化的静态字段。对 HK2 有何影响?
  • stackoverflow.com/q/7325579/2587435... HK2 无法创建 EntityManagerFactoryProvider,因此它无法在链上创建任何其他内容。创建 EntityManagerFactory 可能有问题

标签: java hibernate rest jersey jetty


【解决方案1】:

解决方案是迁移到 Tomcat。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多