簡體   English   中英

與Jersey 2.x的InjectionResolver - 資源被調用兩次

[英]InjectionResolver with Jersey 2.x — Resource being called twice

我試圖弄清楚如何使用自定義注釋和HK2將一些東西注入到Resource方法中。 因為我在Spring webapp環境中,所以我只是在現有的helloworld-spring-webapp Jersey 2示例上。 我的問題是,Resource方法是否被調用兩次。 第一次,注射成功,第二次,它沒有。

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);
}

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的問題將是一個非問題。

我遇到了完全相同的問題 - 兩次調用帶注釋的資源方法。 經過深入調查,我找到了方法,如何在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());
    }
}

希望它會有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM