Java EE - 如何在带有自定义注解的方法上注入方法参数
Java EE - How to inject method parameter on method with custom annotation
假设我在 Java EE/EJB/JAX-RS 中有以下代码:
@POST
@Path("some/path")
@MyAnnotation
public MyResponse createActivation(MyRequest request, CustomValue value) {
// ...
}
如果存在注释,如何检查自定义 @MyAnnotation
注释是否存在并根据某些请求上下文参数填充 CustomValue value
方法参数?
注意:我已经使用 HandlerInterceptorAdapter
和 HandlerMethodArgumentResolver
在 Spring 中拥有此代码。现在我需要在没有 Spring 的情况下做同样的事情。我已经发现了 ContainerRequestFilter
并用它来检查注释,但现在我正在努力注入方法参数。
自定义方法参数注入的处理方式与正常(即字段、构造函数)注入略有不同。对于 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。它显示了另一种方法来做到这一点,您不需要显式注入,而且您将能够在所有三个区域(字段、构造函数和方法参数)中注入值。
假设我在 Java EE/EJB/JAX-RS 中有以下代码:
@POST
@Path("some/path")
@MyAnnotation
public MyResponse createActivation(MyRequest request, CustomValue value) {
// ...
}
如果存在注释,如何检查自定义 @MyAnnotation
注释是否存在并根据某些请求上下文参数填充 CustomValue value
方法参数?
注意:我已经使用 HandlerInterceptorAdapter
和 HandlerMethodArgumentResolver
在 Spring 中拥有此代码。现在我需要在没有 Spring 的情况下做同样的事情。我已经发现了 ContainerRequestFilter
并用它来检查注释,但现在我正在努力注入方法参数。
自定义方法参数注入的处理方式与正常(即字段、构造函数)注入略有不同。对于 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。它显示了另一种方法来做到这一点,您不需要显式注入,而且您将能够在所有三个区域(字段、构造函数和方法参数)中注入值。