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

两次调用Jersey 2.x资源的InjectionResolver

漆雕修德
2023-03-14

我试图弄清楚如何使用自定义注释和HK2将一些东西注入到资源方法中。因为我处于Spring webapp环境中,所以我只是在现有的helloworld-spring-webapp Jersey 2示例的基础上进行了讨论。我的问题是,资源方法被调用了两次。第一次注射成功,第二次注射失败。

InjectionResolver.Resolve()方法

@Override
public Object resolve(Injectee injectee, ServiceHandle<?> root) {
    return "THIS HAS BEEN INJECTED APPROPRIATELY";
}

binder.configure()方法

@Override
protected void configure() {
    bind(SampleInjectionResolver.class).to(new TypeLiteral<InjectionResolver<SampleParam>>() {}).in(Singleton.class);
}
public MyApplication () {
    register(new SampleInjectionResolver.Binder());
    ...
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getHello(@SampleParam String inject) {
    System.err.println("EXECUTING!");
    System.err.println("*******************************INJECTED: " + inject);
    return inject;
}

单个调用的服务器输出

EXECUTING!
*******************************INJECTED: THIS HAS BEEN INJECTED APPROPRIATELY
EXECUTING!
*******************************INJECTED:

我是不是错过了什么配置?我不明白为什么要打两次电话。我假设如果我解决了这个问题,InjectionResolver在第二次调用时不工作的问题将是一个不存在的问题。

共有1个答案

冯茂实
2023-03-14

我面临着完全相同的问题--两次调用带注释的资源方法。经过深入的研究,我找到了如何在Jersey 2.x中使用自定义注释的方法。

自定义注释类(TestMessage.java):

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER })
public @interface TestMessage {}

自定义注释解析程序(TestMessageResolver.java):

public class TestMessageResolver {
    // InjectionResolver implementation
    public static class TestMessageInjectionResolver extends ParamInjectionResolver<TestMessage> {
        public TestMessageInjectionResolver() {
            super(TestMessageValueFactoryProvider.class);
        }
    }

    // ValueFactoryProvider implementation
    @Singleton
    public static class TestMessageValueFactoryProvider extends AbstractValueFactoryProvider {
        @Inject
        public TestMessageValueFactoryProvider(MultivaluedParameterExtractorProvider mpep, ServiceLocator injector) {
            super(mpep, injector, Parameter.Source.UNKNOWN);
        }

        @Override
        protected Factory<?> createValueFactory(Parameter parameter) {
            Class<?> classType = parameter.getRawType();

            if (classType == null || (!classType.equals(String.class))) {
                return null;
            }

            return new AbstractContainerRequestValueFactory<String>() {
                @Override
                public String provide() {
                    return "testString";
                }
            };
        }
    }

    // Binder implementation
    public static class Binder extends AbstractBinder {
        @Override
        protected void configure() {
            bind(TestMessageValueFactoryProvider.class).
                to(ValueFactoryProvider.class).
                in(Singleton.class);

            bind(TestMessageInjectionResolver.class).
                to(new TypeLiteral<InjectionResolver<TestMessage>>(){}).
                in(Singleton.class);
        }
    }
}
@Path("jersey")
public class JerseyResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getMethod(@TestMessage String message) {
        return "getMethod(), message=" + message;
    }
}
public class SpringJerseyApplication extends ResourceConfig {
    public SpringJerseyApplication() {
        register(JerseyResource.class);
        register(new TestMessageResolver.Binder());
    }
}
 类似资料:
  • 问题内容: 我有一个基本的node.js设置,但是我想缺少一些东西。 我的: 我的: 问题是我的控制台输出了两次。我想念什么吗?刷新页面时,我只希望有一个。 问题答案: 您所浏览的URL可能还试图获取favicon.ico。尝试仅在命令行上执行以下命令: 另外,您可以为添加日志记录。这将告诉您正在请求哪些URL。

  • 我觉得有一个简单的解决办法,但由于某些原因,我不能把我的头围绕它。 我有一个情况,一个按钮必须先点击,才能点击另一个。用户为这2个JButtons选择的选项将决定程序的下一步。这意味着我必须调用actionListener两次,对吗?我如何在一个actionPerformed方法中做到这一点? 如果actionPerformed方法中的(e.getSource()==Square[1][4]&&e

  • 问题内容: 我在Go中关注一个简单的Web服务器示例。 我插入了一条语句,使生成的代码如下所示: 问题是,每当我在Web浏览器中加载端口8000时,此函数就会被调用两次。这是一个问题,因为我打算在每次页面访问时增加一个计数器。通过这种行为,计数器将增加两次。OTOH,如果我这样做,它只会被调用一次。 我觉得我在这里失踪真的很愚蠢。 问题答案: 只需记录请求。您将意识到您的浏览器还请求/favico

  • 我仍在尝试将RXJava2用于多个订阅者使用的轮询服务。它工作得很好,除了它总是调用两次。 我尝试使用publish(1)、take(1)、share()、refCount()等,但结果总是一样。叫两次或多次。 我还是不明白为什么它叫了两次。新订阅服务器应该接收最新发出的值,并且只在更改后的值(如果hashmap更改了)返回为modified List。 我的民意调查可观察到(单例) 我的谓词用于

  • Kubernetes作为一个容器编排调度引擎,资源调度是它的最基本也是最重要的功能,这一节中我们将着重讲解Kubernetes中是如何做资源调度的。 Kubernetes中有一个叫做kube-scheduler的组件,该组件就是专门监听kube-apiserver中是否有还未调度到node上的pod,再通过特定的算法为pod指定分派node运行。 Kubernetes中的众多资源类型,例如Depl

  • 问题内容: 民间, 我的代码设置如下: 我给人的印象是,只有在所有资源都解析完之后,才会调用“ then”函数。但是,这不是我在代码中看到的。如果打印data1,我将无法解决。 关于我在这里缺少什么的任何线索?? 问题答案: 我遇到了这个问题,这很令人困惑。问题似乎是,调用资源操作实际上并没有返回http承诺,而是一个空引用(当数据从服务器返回时填充该引用-请参阅$ resource docs 的