Jersey 1 @Inject 迁移到 Jersey 2 停止工作

Posted

技术标签:

【中文标题】Jersey 1 @Inject 迁移到 Jersey 2 停止工作【英文标题】:Jersey 1 @Inject migrated to Jersey 2 stopped working 【发布时间】:2022-01-06 15:59:33 【问题描述】:

我正在将我的系统从 Jersey 1 迁移到 Jersey 2。 在我的代码中,我有来自com.sun.jersey.spi.inject.Inject@Inject 注释和来自com.sun.jersey.spi.resource.Singleton@Singleton。我已将这些更改为 javax.inject.Injectjavax.inject.Singleton

自从这个更改以来,我在注入任何带有它注释的对象时都会出错。我的错误是这样的

javax.servlet.ServletException: A MultiException has 4 exceptions.  They are:
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=APIConnectorHandler,parent=BarcodeSearchClient,qualifiers=,position=-1,optional=false,self=false,unqualified=null,1090224052)
2. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=APIConnectorHandler,parent=RSearchClient,qualifiers=,position=-1,optional=false,self=false,unqualified=null,1247004825)
3. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.search.barcode.BarcodeSearchClient errors were found
4. java.lang.IllegalStateException: Unable to perform operation: resolve on com.search.barcode.BarcodeSearchClient

    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:423)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:334)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    com.filter.MetricsEmittingFilter.doFilter(MetricsEmittingFilter.java:89)

APIConnectorHandlerRSearchClientBarcodeSearchClient 中都被注入。我首先调用流程中的 RSearchClient 端点,然后调用 BarcodeSearchClient,因为 RSearchClient 也显示为异常 #2。

我的 web.xml 看起来像这样

<?xml version="1.0"?>
<!--
When modifying this file, DO NOT FORGET to also modify workspace-web.xml
if necessary so that "brazil-build server" will work.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <context-param>
        <description>Spring Expression Language Support</description>
        <param-name>springJspExpressionSupport</param-name>
        <param-value>false</param-value>
    </context-param>
    <listener>
        <listener-class>com.abc.listener.ContextListener</listener-class>
    </listener>


    <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.search, com.fasterxml.jackson.jaxrs.json
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>JerseyServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <filter-mapping>
        <filter-name>MetricsEmittingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

我确实找到了一些 Hk2 无法找到豆子和东西的东西,但我无法理解的是它在 Jersey 1 中是如何工作的。Jersey 1 @Inject 从哪里得到豆子?

PS。这是一个超级遗留代码,我真的不知道为什么,但它具有弹簧集成,但没有一个对象被创建为 bean。它们只是在多个地方用 new 初始化。 Spring 仅用于初始化特定于区域的 bean。

【问题讨论】:

Jersey 1.x 和 2.x 注入的工作方式完全不同。甚至与 Spring 的集成。 @PaulSamsotha 有什么我能理解的好例子吗?除了文档我找不到任何好的例子 【参考方案1】:

搞定了。我必须创建一个活页夹类和应用程序类并将其链接到 web.xml。 binder 类需要绑定我通过 @Inject 注入的所有类及其依赖项。

已关注https://www.appsdeveloperblog.com/dependency-injection-hk2-jersey-jax-rs/

【讨论】:

以上是关于Jersey 1 @Inject 迁移到 Jersey 2 停止工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在内存中进行单元测试 Spring-Jersey

使用 WADL 对 Jersey 应用程序的 CORS 支持

Bitcoind JSON-RPC:Java Jersey 客户端:来自服务器错误的文件意外结束

升级到 JSF 2.3 后,@Inject 在 @FacesConverter 中不起作用

Jersey:如何注册省略某些子类的ExceptionMapper?

迁移 Jersey 项目以使用 Java 10 导致 jersey.repackaged.org.objectweb.asm.ClassReader.<init> 处的 java.lang