2016-12-16 197 views
0

假设我在Java EE的一个下面的代码/ EJB/JAX-RS:的Java EE - 如何在方法与自定义注解注入方法参数

如何检查定制@MyAnnotation注释的存在并且在注解存在的情况下基于一些请求上下文参数填充CustomValue value方法参数?

注意:我已经在Spring中使用了这个代码,使用了HandlerInterceptorAdapterHandlerMethodArgumentResolver。现在我需要在没有Spring的情况下做同样的事情。我已经发现ContainerRequestFilter,我用它来检查注释,但现在我正在注入方法参数。

回答

0

自定义方法参数注入处理与正常(即字段,构造函数)注入有点不同。有了泽西岛,这需要执行ValueFactoryProvider。对于你的情况下,它会看起来像

public class MyAnnotationParamValueProvider implements ValueFactoryProvider { 

    @Inject 
    private ServiceLocator locator; 

    @Override 
    public Factory<?> getValueFactory(Parameter parameter) { 
     if (parameter.getAnnotation(MyAnnotation.class) != null 
       && parameter.getRawType() == CustomValue.class) { 
      final Factory<CustomValue> factory 
        = new AbstractContainerRequestValueFactory<CustomValue>() { 
       @Override 
       public CustomValue provide() { 
        final ContainerRequest request = getContainerRequest(); 
        final String value = request.getHeaderString("X-Value"); 
        return new CustomValue(value); 
       } 
      }; 
      locator.inject(factory); 
      return factory; 
     } 
     return null; 
    } 

    @Override 
    public PriorityType getPriority() { 
     return Priority.NORMAL; 
    } 
} 

然后,你需要用ResourceConfig

public class AppConfig extends ResourceConfig { 
    public AppConfig() { 
     register(new AbstractBinder() { 
       @Override 
       protected void configure() { 
        bind(MyAnnotationParamValueProvider.class) 
         .to(ValueFactoryProvider.class) 
         .in(Singleton.class); 
       } 
     }); 
    } 
} 

注册它见this Gist

还看到一个完整的例子:

+0

谢谢你的回答! :)有没有办法做到这一点没有ResourceConfig类,例如使用注释?我必须与Swift一起工作的管理员让我柔软......:D –

+0

所以你使用的是web.xml(和包扫描)?如果是这样,看看[这篇文章](http://stackoverflow.com/a/29275727/2587435) –

+0

不,没有web.xml ...和没有包扫描。但基于[这篇文章](http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/),我相信包扫描可以在代码中配置以及 - 我会给它一个镜头。 :) 谢谢! –