Jersey 2 и Jetty: обнаружен неизвестный сбой HK2 - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь написать приложение REST с Джерси и Джетти. Стек: Java 11, Gradle 6.1.1, Джерси 2.30, Hibernate 5.4.X, сервер Jetty и сервлет в версии 9.4.26.v20200117. Проблема появляется, когда 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;
    }
}

Проект также содержит постоянство. xml конфигурация - он работает в другом проекте, поэтому все должно быть в порядке.

Самое странное, что когда я запускаю проект из IntelliJ, он работает хорошо. Сборка и запуск банок без каких-либо действий также выглядит хорошо, но лестница появляется, когда я звоню по URL из веб-браузера: http://localhost: 8080 / api / user / get-all

Затем HK2 не удалось с внедрением зависимости. Я понятия не имею, что не так. Если кому-то понадобится, я могу отправить весь стек исключений (не поместил его, причина его длины ...).

Как настроить работу Jersey 2 и Jetty для работы в описанном случае?

...