Java 自定义注释过滤器弹簧引导
我发现使用SpringBoot创建过滤器非常简单。就跟着这篇文章走吧 我找不到的是如何创建注释,将控制器中的特定端点订阅到一个过滤器 在Jax-RS中,它看起来像Java 自定义注释过滤器弹簧引导,java,spring,spring-boot,Java,Spring,Spring Boot,我发现使用SpringBoot创建过滤器非常简单。就跟着这篇文章走吧 我找不到的是如何创建注释,将控制器中的特定端点订阅到一个过滤器 在Jax-RS中,它看起来像 @GET @Path("jax-rs-single") @Reactive(ttlRequest = 2000) @Produces(MediaType.APPLICATION_JSON) public Single getSingle() { return Single.just("
@GET
@Path("jax-rs-single")
@Reactive(ttlRequest = 2000)
@Produces(MediaType.APPLICATION_JSON)
public Single getSingle() {
return Single.just("Hello world single");
}
其中,@Reactive
将触发每个请求的ReactiveFilter实现
我也看到了@WebFlow注释,但这不是我想要的。我想创建一个库,消费者在其中决定使用哪个过滤器,只需在控制器中添加注释
你知道如何用Spring boot/MVC做类似的事情吗
关于如果我正确理解您的需求,主要问题是如何基于自定义注释应用过滤器 因此,首先,您可以使用常规的Spring过滤器(Spring Webflux的情况下使用
WebFilter
,Spring MVC的情况下使用filter
),但您需要编写一些自定义逻辑
要根据注释进行过滤,您应该:
RequestMappingHandlerMapping#getHandlerInternal()
方法检索对处理请求的方法的引用(在您的示例中是getSingle()
)HandlerMethod
时,您可以检查该方法是否使用hasMethodAnnotation(类annotationType)
方法应用了自定义注释chain.doFilter(request,response)
而不执行任何操作,要么应用自定义逻辑,然后触发过滤器链的其余部分如果我正确理解了您的需求,那么主要问题是如何基于自定义注释应用过滤器 因此,首先,您可以使用常规的Spring过滤器(Spring Webflux的情况下使用
WebFilter
,Spring MVC的情况下使用filter
),但您需要编写一些自定义逻辑
要根据注释进行过滤,您应该:
RequestMappingHandlerMapping#getHandlerInternal()
方法检索对处理请求的方法的引用(在您的示例中是getSingle()
)HandlerMethod
时,您可以检查该方法是否使用hasMethodAnnotation(类annotationType)
方法应用了自定义注释chain.doFilter(request,response)
而不执行任何操作,要么应用自定义逻辑,然后触发过滤器链的其余部分我将在这里详细介绍Spring中的自定义注释和处理器 我不知道你想要什么或你需要什么,但我会给出一个通用的例子 您有两种选择:
- 豆处理器
- 手持拦截器
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Documented
public @interface Reactive {
Integer ttlRequest;
}
2-实现BeanPostProcessor
@Component
public class ReactiveAnnotationProcessor implements BeanPostProcessor {
private ConfigurableListableBeanFactory configurableBeanFactory;
@Autowired
public ReactiveAnnotationProcessor(ConfigurableListableBeanFactory beanFactory) {
this.configurableBeanFactory = beanFactory;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
this.scanReactiveAnnotation(bean, beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
protected void scanReactiveAnnotation(Object bean, String beanName) {
this.configureMethodInjection(bean);
}
private void configureMethodInjection(Object bean) {
Class<?> managedBeanClass = bean.getClass();
MethodCallback methodCallback =
new ReactiveMethodCallback(configurableBeanFactory, bean);
ReflectionUtils.doWithMethod(managedBeanClass, methodCallback);
}
}
这是一个关于注释处理的好来源,它是关于FieldProcessing的,但是如果您有疑问,您可以更改接口以实现所需的功能:
[更新]您也可以创建HandlerInterceptor:
拦截器
并注册您的处理程序:
@Configuration
public class WebMvcConfig extends WebMvcConfigurer {
@Autowired
ReactiveFilterHandlerInterceptor reactiveFilterHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(reactiveFilterHandlerInterceptor);
}
}
我将在这里详细介绍Spring中的自定义注释和处理器 我不知道你想要什么或你需要什么,但我会给出一个通用的例子 您有两种选择:
- 豆处理器
- 手持拦截器
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Documented
public @interface Reactive {
Integer ttlRequest;
}
2-实现BeanPostProcessor
@Component
public class ReactiveAnnotationProcessor implements BeanPostProcessor {
private ConfigurableListableBeanFactory configurableBeanFactory;
@Autowired
public ReactiveAnnotationProcessor(ConfigurableListableBeanFactory beanFactory) {
this.configurableBeanFactory = beanFactory;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
this.scanReactiveAnnotation(bean, beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
protected void scanReactiveAnnotation(Object bean, String beanName) {
this.configureMethodInjection(bean);
}
private void configureMethodInjection(Object bean) {
Class<?> managedBeanClass = bean.getClass();
MethodCallback methodCallback =
new ReactiveMethodCallback(configurableBeanFactory, bean);
ReflectionUtils.doWithMethod(managedBeanClass, methodCallback);
}
}
这是一个关于注释处理的好来源,它是关于FieldProcessing的,但是如果您有疑问,您可以更改接口以实现所需的功能:
[更新]您也可以创建HandlerInterceptor:
拦截器
并注册您的处理程序:
@Configuration
public class WebMvcConfig extends WebMvcConfigurer {
@Autowired
ReactiveFilterHandlerInterceptor reactiveFilterHandlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(reactiveFilterHandlerInterceptor);
}
}
谢谢你的解决方案。这很奇怪,你不能只使用spring的过滤器,你必须做所有这些,mambo JamboAlso,我宁愿避免反射。我想,即使是过滤器,你最终也会使用反射来检查注释,除非它发生在编译时,比如dagger或micronaut注释。我会试着考虑使用过滤器。@paul如果你同意并且这有帮助,你能接受这个答案吗?谢谢你的解决方案。这很奇怪,你不能只使用spring的过滤器,你必须做所有这些,mambo JamboAlso,我宁愿避免反射。我想,即使是过滤器,你最终也会使用反射来检查注释,除非它发生在编译时,比如dagger或micronaut注释。我会考虑使用这个过滤器。@paul如果你同意并且这有帮助,你能接受这个答案吗?我怀疑Jax-rs中的过滤器是否是一个普通的servlet过滤器。原因是servlet过滤器只能映射到URL或servlet。在过滤器中,它不知道最终将处理请求的内容。除非有另一个框架提供此功能,并且在配置时将此功能添加到过滤器中,否则您将需要编写自己的处理和注册。Jax-rs提供了传递到过滤器的可能性,以获取调用端点的信息。默认servlet过滤器未提供此功能,因此它必须是一个扩展或者一个特定的JAX-RS过滤器。因此,除非有其他框架来完成这项工作,否则您需要自己编写(如答案之一所示)。在SpringMVC中没有解决方案,因为它是基于阻塞ServletAPI的,所以您可以