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

标签 java jakarta-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 方法参数?

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

最佳答案

自定义方法参数注入(inject)的处理方式与普通(即字段、构造函数)注入(inject)略有不同。对于 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 中的完整示例

另请参阅:

  • Custom Method Parameter Injection with Jersey 。它展示了另一种执行此操作的方法,您不需要显式注入(inject),而且您还可以在所有三个区域(字段、构造函数和方法参数)中注入(inject)值。

关于Java EE - 如何使用自定义注释在方法上注入(inject)方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41181770/

相关文章:

java - 删除变音符号和平台问题

mysql - Eclipse JPA 和 MySQL - JPA 方面的通用与 Eclipse Link 平台

jakarta-ee - 您如何部署 Web 应用程序?

java - Android 上的 ReSTLet 是否可以移植到 Java SE/EE?

http - 如何从 Jersey Web 响应中获取响应 URI?

java - 批量向java函数传递参数

java - 使用 java 和 wunderground api 获取天气数据

java - Spring boot 找不到 PropertySource : label not found

java - 在一个请求中多次上传到 servlet

jpa - Jersey + HK2 + 灰熊 : Proper way to inject EntityManager?