是否可以在没有 DI 容器的情况下使用 Jersey?
Is it possible to use Jersey without DI container?
我需要在 SE 环境中使用没有 CDI 容器的 Jersey 2.28(带有 Jetty)。我所有的设置都在 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[=13=](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[=13=](ServletHandler.java:750) [jetty-servlet-9.4.14.v20181114.jar:?]
我知道 Jersey 可以与不同的 DI 容器一起使用,例如 Weld、HK2 等。但是是否可以在没有 DI 容器的情况下使用它?如果是,那又如何?
不,这不可能。 Jersey 的依赖注入提供者只有一个 SPI。它需要一个实现 运行。与 JAX-RS 相同的方式只是一个规范,但它需要一个实现(如 Jersey 或 RESTEasy)运行。这是完全一样的事情。 Jersey 在内部使用了大量的依赖注入,所以核心代码在其代码库中使用了 DI 的外观。而我们需要为它提供底层实现给运行。如您所见,当前可用的实现是 HK2 和 CDI(jersey-hk2
和 jersey-cdi2-se
)。我确定你已经看过 this post
我需要在 SE 环境中使用没有 CDI 容器的 Jersey 2.28(带有 Jetty)。我所有的设置都在 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[=13=](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[=13=](ServletHandler.java:750) [jetty-servlet-9.4.14.v20181114.jar:?]
我知道 Jersey 可以与不同的 DI 容器一起使用,例如 Weld、HK2 等。但是是否可以在没有 DI 容器的情况下使用它?如果是,那又如何?
不,这不可能。 Jersey 的依赖注入提供者只有一个 SPI。它需要一个实现 运行。与 JAX-RS 相同的方式只是一个规范,但它需要一个实现(如 Jersey 或 RESTEasy)运行。这是完全一样的事情。 Jersey 在内部使用了大量的依赖注入,所以核心代码在其代码库中使用了 DI 的外观。而我们需要为它提供底层实现给运行。如您所见,当前可用的实现是 HK2 和 CDI(jersey-hk2
和 jersey-cdi2-se
)。我确定你已经看过 this post