【问题标题】:InjectionResolver with Jersey 2.x -- Resource being called twice带有 Jersey 2.x 的 InjectionResolver -- 资源被调用两次
【发布时间】:2013-10-01 14:16:53
【问题描述】:

我试图弄清楚如何使用自定义注释和 HK2 将某些东西注入 Resource 方法。因为我在 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);
}

binder的ResourceConfig注册

public MyApplication () {
    register(new SampleInjectionResolver.Binder());
    ...

JerseyResource.getHello()

@GET
@Produces(MediaType.TEXT_PLAIN)
public String getHello(@SampleParam String inject) {
    System.err.println("EXECUTING!");
    System.err.println("*******************************INJECTED: " + inject);
    return inject;
}

SINGLE 调用的服务器输出

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

我是否遗漏了某处的配置?我不明白为什么它被调用了两次。我假设如果我解决了这个问题,InjectionResolver 在第二次调用中不起作用的问题将是一个非问题。

【问题讨论】:

    标签: java spring jax-rs jersey-2.0 hk2


    【解决方案1】:

    我遇到了完全相同的问题 - 两次调用带注释的资源方法。 经过深入调查,我找到了方法,如何在 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);
            }
        }
    }
    

    自定义注解用法(JerseyResource.java):

    @Path("jersey")
    public class JerseyResource {
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String getMethod(@TestMessage String message) {
            return "getMethod(), message=" + message;
        }
    }
    

    解析器注册(SpringJerseyApplication.java):

    public class SpringJerseyApplication extends ResourceConfig {
        public SpringJerseyApplication() {
            register(JerseyResource.class);
            register(new TestMessageResolver.Binder());
        }
    }
    

    希望对你有所帮助:)

    【讨论】:

    • 如果注解同时有 PARAMETER 和 METHOD 作为目标怎么办?应该怎么处理?
    • @alexander-aleksiuk,您是否能够确定该方法被调用两次的确切原因?我有一个实现是very similar to yours,但是资源方法仍然被调用了两次。但不同的是,第一次不注入参数,第二次注入。
    • 没关系,我的问题原来是无关的。 JIRA 上提供了更详细的解释,我实现了 fix
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多