Java EE - 如何使用自定义注释在方法上注入方法参数

时间:2016-12-16 10:02:11

标签: java java-ee jersey jax-rs jersey-2.0

假设我在Java EE / EJB / JAX-RS中有以下代码:

@POST
@Path("some/path")
@MyAnnotation
public MyResponse createActivation(MyRequest request, CustomValue value) {
   // ...
}

如果注释存在,如何检查是否存在自定义@MyAnnotation注释并根据某些请求上下文参数填充CustomValue value方法参数?

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

1 个答案:

答案 0 :(得分:0)

自定义方法参数注入的处理方式与正常(即字段,构造函数)注入略有不同。对于Jersey,这需要实现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

中的完整示例

另见: