Можно ли использовать Джерси без DI контейнера? - PullRequest
0 голосов
/ 01 мая 2019

Мне нужно использовать Jersey 2.28 (с Jetty) без контейнера CDI в среде SE. Все мои настройки находятся в web.xml:

<servlet>
    <servlet-name>JerseyServlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.noname.rest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>JerseyServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Вот зависимости, которые я использую:

javax.ws.rs-api-2.1.1.jar
javax.activation-1.2.0.jar
jersey-container-jetty-http-2.28.jar
jersey-container-servlet-core-2.28.jar
jersey-server-2.28.jar
jersey-common-2.28.jar
cdi-api-2.0.jar
javax.inject-2.5.0-b62.jar

Это мой ресурс:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("myresource")
public class MyResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }
}

И вот что я получаю:

java.lang.IllegalStateException: InjectionManagerFactory not found.
    at org.glassfish.jersey.internal.inject.Injections.lambda$lookupInjectionManagerFactory$0(Injections.java:74) ~[jersey-common-2.28.jar:?]
    at java.util.Optional.orElseThrow(Optional.java:408) ~[?:?]
    at org.glassfish.jersey.internal.inject.Injections.lookupInjectionManagerFactory(Injections.java:74) ~[jersey-common-2.28.jar:?]
    at org.glassfish.jersey.internal.inject.Injections.createInjectionManager(Injections.java:69) ~[jersey-common-2.28.jar:?]
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:258) ~[jersey-server-2.28.jar:?]
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311) ~[jersey-container-servlet-core-2.28.jar:?]
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154) ~[jersey-container-servlet-core-2.28.jar:?]
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:346) ~[jersey-container-servlet-core-2.28.jar:?]
    at javax.servlet.GenericServlet.init(GenericServlet.java:244) ~[javax.servlet-api-and-schemas-3.1.0.jar:?]
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:672) [jetty-servlet-9.4.14.v20181114.jar:?]
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:429) [jetty-servlet-9.4.14.v20181114.jar:?]
    at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750) [jetty-servlet-9.4.14.v20181114.jar:?]

Я знаю, что Джерси можно использовать с разными контейнерами DI, например, Weld, HK2 и т. Д. Но возможно ли использовать его без контейнера DI? Если да, то как?

1 Ответ

2 голосов
/ 01 мая 2019

Нет, это невозможно. Джерси имеет только SPI для своего поставщика инъекций зависимостей. Для его запуска требуется реализация. То же, что и JAX-RS, это просто спецификация, но для ее запуска требуется реализация (например, Jersey или RESTEasy). Это точно так же. В Джерси внутреннее внедрение большого количества зависимостей, поэтому основной код использует фасад для DI в своей кодовой базе. И мы должны предоставить базовую реализацию для его запуска. В настоящее время доступны, как вы понимаете, реализации HK2 и CDI (jersey-hk2 и jersey-cdi2-se). Я уверен, что вы видели это сообщение

...