当前位置: 首页 > 知识库问答 >
问题:

有没有可能使用没有DI容器的Jersey?

宋景福
2023-03-14

我需要在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$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:?]

我知道Jersey可以与不同的DI容器一起使用,例如Weld、HK2等,但是否可以不使用DI容器?如果是,那又是怎样做的呢?

共有1个答案

林弘文
2023-03-14

不,这不可能。Jersey只有其依赖注入提供程序的SPI。它需要一个实现来运行。与JAX-RS相同的方式只是一个规范,但它需要一个实现(如Jersey或RESTEasy)才能运行。这完全是一回事。Jersey在内部使用了大量的依赖注入,因此核心代码在其代码库中为DI使用了一个facade。并且我们需要提供它运行的底层实现。正如您所了解的,当前可用的实现是HK2和CDI(Jersey-HK2Jersey-CDI2-SE)。我肯定你已经看过这个帖子了

 类似资料:
  • 假设我有一个< code>json数组数组 我想将其分解为<code>ArrayList

  • 有没有可能,没有应用服务器发送推送通知使用fire-base实时数据库和通知在Android?

  • 我最近读到了这篇关于为一组已知的键生成一个最小完美哈希表的文章:Throw away the Keys:Easy,Minimal Perfect Hashing。 本文似乎假设您需要一个中间表。如果我们假设键的集合很小(即<64),那么有没有其他更简单的方法来生成这样的函数。 在我的例子中,我希望将一组线程ID:s映射到数组中的唯一数据块。线程在哈希函数生成之前启动,并且在程序运行期间保持不变。线

  • 搜索网页,目前还不清楚Android开发是否支持Java 8。 在我下载/安装Java 8之前,有没有人可以告诉我任何一个“官方”文档,说Java 8是或不是支持Android开发。

  • 问题内容: 我试图在Docker容器中使用perf工具来记录给定命令。 设置为1,但是当我不放置该标志时,容器的行为就像是2 。 我可以使用,但是我在perf上运行的代码是不可信的,并且如果我可以通过允许使用perf工具承担一点安全风险,那么在容器上赋予特权权限似乎具有不同的风险级别。 还有其他使用容器内部perf的方法吗? 问题答案: 经过研究,问题不在于,而是(syscall)已在Docker

  • 我正在开发一个服务器端应用程序,即RESTAPI。用户可以通过这个API将自己手工制作的客户端的数据发布到我们自己的系统中。当然,我会记录数据的格式。但我的问题是,使用OAuth2实现身份验证是明智之举,还是我最好只使用SSL基本身份验证路由?若然,原因为何?我在谷歌上搜索了大量关于OAuth2的帖子和指南,如果不是他们正在处理的客户端,那就是Spring Security组合,我发现它很难遵循,