java - Jersey 2 中的两个自定义注入(inject)注释

标签 java annotations jersey inject hk2

为了让两个自定义注入(inject)注释在 Jersey 2 中共存,我应该如何进行 ValueFactoryProvider 绑定(bind)?下面我提供了一个我当前方法的示例,您可以看到 Hello 注释注入(inject)“隐藏”了 SmallTalk 注释注入(inject)。

你好注解:

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

SmallTalk 注释:

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

你好注解解析器:

@Singleton
public class HelloResolver {
    public static class HelloInjectionResolver extends ParamInjectionResolver<Hello> {
        public HelloInjectionResolver() {
            super(HelloValueFactoryProvider.class);
        }
    }

    @Singleton
    public static class HelloValueFactoryProvider extends AbstractValueFactoryProvider {
        @Inject
        public HelloValueFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider,
                                         final ServiceLocator injector) {
            super(extractorProvider, injector, UNKNOWN);
        }

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

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

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

    public static class Binder extends AbstractBinder {
        @Override
        protected void configure() {
            bind(HelloValueFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
            bind(HelloInjectionResolver.class).to(
                    new TypeLiteral<InjectionResolver<Hello>>() {
                    }
            ).in(Singleton.class);
        }
    }
}

SmallTalk 注释解析器:

@Singleton
public class SmallTalkResolver {
    public static class SmallTalkInjectionResolver extends ParamInjectionResolver<SmallTalk> {
        public SmallTalkInjectionResolver() {
            super(SmallTalkValueFactoryProvider.class);
        }
    }

    @Singleton
    public static class SmallTalkValueFactoryProvider extends AbstractValueFactoryProvider {
        @Inject
        public SmallTalkValueFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider,
                                             final ServiceLocator injector) {
            super(extractorProvider, injector, UNKNOWN);
        }

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

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

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

    public static class Binder extends AbstractBinder {
        @Override
        protected void configure() {
            bind(SmallTalkValueFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
            bind(SmallTalkInjectionResolver.class).to(
                    new TypeLiteral<InjectionResolver<SmallTalk>>() {
                    }
            ).in(Singleton.class);
        }
    }
}

资源配置:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new HelloResolver.Binder());
        register(new SmallTalkResolver.Binder());
        registerClasses(HelloResource.class);
    }
}

同时使用注入(inject)注解的资源:

@Path("/")
public class HelloResource {
    @GET
    @Path("hello")
    @Produces("application/json")
    public String hello(@Hello final String hello, @SmallTalk final String smallTalk) {
        return hello + " " + smallTalk;
    }
}

请求资源时的结果 - 应该是 "Hello! Nice weather.":

最佳答案

找到解决办法了!我加了

if (parameter.getAnnotation(Hello.class) == null) return null;

if (parameter.getAnnotation(SmallTalk.class) == null) return null;

到两个值工厂提供程序的 createValueFactory 方法。

关于java - Jersey 2 中的两个自定义注入(inject)注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600849/

相关文章:

java - 如何将 Jersey 应用程序部署到远程 Tomcat 服务器

java - 使用 Java API 验证 X509 证书

java - 根据用户输入点创建折线图

java - 在Java中,为什么@Nullable有运行时保留

Java注解字段setter和getter如何

Java Rest 删除错误

rest - 带有 Struts2 的 Jersey

java - 从 Activity 访问变量到 RecyclerView 适配器

java - 如何在checkstyle中的 "excludedClasses"中设置默认+自己的类

javascript - DKfindout.com(网站)如何对图像进行注释?