Интеграция Jersey в сервер Undertow в Java - PullRequest
0 голосов
/ 10 февраля 2020

Я написал Java приложение с целью размещения его на сервере Undertow и встраивания Джерси для реализации различных запросов API. Класс Application. java отвечает за размещение сервера, а ProductEndpoint. java имеет реализацию с использованием Jersey.

Я реализовал 5 классов. Я использую Eclipse IDE.

Вот мой фрагмент кода: -

1. Приложение. java

package mainClass;

import static io.undertow.servlet.Servlets.listener;
import static io.undertow.servlet.Servlets.servlet;

import javax.servlet.ServletException;

import org.glassfish.jersey.servlet.ServletContainer;
import org.jboss.weld.environment.servlet.Listener;

import io.undertow.Handlers;
import io.undertow.Undertow;
import io.undertow.server.handlers.PathHandler;
import io.undertow.servlet.Servlets;
import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.DeploymentManager;


public class Application {
    private static Undertow server;

    public static void main(String[] args) throws ServletException {
        startContainer(9090);
    }

    public static void stopContainer(){
        server.stop();
    }

    public static void startContainer(int port) throws ServletException {
        DeploymentInfo servletBuilder = Servlets.deployment();

        servletBuilder
                .setClassLoader(Application.class.getClassLoader())
                .setContextPath("/mainClass")
                .setDeploymentName("mainClass.war")
                .addListeners(listener(Listener.class))
                .addServlets(servlet("jerseyServlet", ServletContainer.class)
                        .setLoadOnStartup(1)
                        .addInitParam("javax.ws.rs.Application", JerseyApp.class.getName())
                        .addMapping("/api/*"));

        DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);
        manager.deploy();
        PathHandler path = Handlers.path(Handlers.redirect("/mainClass"))
                .addPrefixPath("/mainClass", manager.start());

        server =
                Undertow
                        .builder()
                        .addHttpListener(port, "localhost")
                        .setHandler(path)
                        .build();

        server.start();
    }
}

2. JerseyApp. java

package mainClass;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("/api/*")
public class JerseyApp extends ResourceConfig {
    public JerseyApp() {
        packages(true, "mainClass");
    }
}

3. ObjectMapperFactory. java

package mainClass;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;


public class ObjectMapperFactory {
    private static final ObjectMapper OBJECT_MAPPER;

    static {
        OBJECT_MAPPER = new ObjectMapper();

        OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    }

    private ObjectMapperFactory() {
    }

    public static ObjectMapper get() {
        return OBJECT_MAPPER;
    }
}

4. ObjectMapperResolver. java

package mainClass;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.databind.ObjectMapper;

@Provider
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
    @Override
    public ObjectMapper getContext(Class<?> type) {
        return ObjectMapperFactory.get();
    }
}

5. ProductEndpoint. java

package mainClass;


import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.GET;
import javax.ws.rs.Path;


@Path("/v1")
@ApplicationScoped
public class ProductEndpoint {


    @GET
    @Path("/hello")
    public String PrintHello(){

        return "Hello";
    }


    @GET
    @Path("/hai")
    public String PrintHai(){

        return "Hai";
    }

    @GET
    @Path("/selfhost")
    public String PrintSelfHost(){

        return "Self Host";
    }

}

Однако, при выполнении кода Java выдается сообщение об ошибке, как показано ниже, и я не могу разместить сервер.

Feb 10, 2020 5:22:17 PM org.jboss.weld.environment.servlet.Listener contextInitialized
INFO: WELD-ENV-001007: Initialize Weld using ServletContextListener
Feb 10, 2020 5:22:17 PM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.2.14 (Final)
Feb 10, 2020 5:22:17 PM org.jboss.weld.environment.servlet.WeldServletLifecycle initialize
INFO: WELD-ENV-000028: Weld initialization skipped - no bean archive found
Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalStateException: Singleton not set for STATIC_INSTANCE => []
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:224)
    at mainClass.Application.startContainer(Application.java:44)
    at mainClass.Application.main(Application.java:23)
Caused by: java.lang.IllegalStateException: Singleton not set for STATIC_INSTANCE => []
    at org.jboss.weld.bootstrap.api.helpers.RegistrySingletonProvider$RegistrySingleton.get(RegistrySingletonProvider.java:28)
    at org.jboss.weld.Container.instance(Container.java:55)
    at org.jboss.weld.SimpleCDI.<init>(SimpleCDI.java:77)
    at org.jboss.weld.environment.WeldProvider$EnvironmentCDI.<init>(WeldProvider.java:45)
    at org.jboss.weld.environment.WeldProvider.getCDI(WeldProvider.java:61)
    at javax.enterprise.inject.spi.CDI.current(CDI.java:60)
    at org.jboss.weld.servlet.WeldInitialListener.contextInitialized(WeldInitialListener.java:97)
    at org.jboss.weld.servlet.api.helpers.ForwardingServletListener.contextInitialized(ForwardingServletListener.java:34)
    at org.jboss.weld.environment.servlet.Listener.contextInitialized(Listener.java:57)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:195)
    ... 2 more

Может кто-нибудь помочь мне исправить эту ошибку? Существует ли гораздо более простой способ интеграции Джерси на сервере undertow?

Примечание. Я создал приложение без использования каких-либо платформ. Я добавил JAR-файлы необходимых библиотек.

1 Ответ

0 голосов
/ 24 апреля 2020

Я также использую штраф Undertow с штрафом Джерси jaxrs-ri, но без org.jboss.weld.environment.servlet.Listener. Для внедрения зависимостей я просто использую встроенную поддержку только jersey ServiceBinder (подкласс Application) вместе с org.glassfish.hk2.utilities.binding.AbstractBinder. См https://docs.jboss.org/weld/reference/1.0.0/en-US/html/environments.html

...