Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义注释过滤器弹簧引导_Java_Spring_Spring Boot - Fatal编程技术网

Java 自定义注释过滤器弹簧引导

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("

我发现使用SpringBoot创建过滤器非常简单。就跟着这篇文章走吧

我找不到的是如何创建注释,将控制器中的特定端点订阅到一个过滤器

在Jax-RS中,它看起来像

 @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中的自定义注释和处理器

    我不知道你想要什么或你需要什么,但我会给出一个通用的例子

    您有两种选择:

    • 豆处理器
    • 手持拦截器
    豆处理器 基本上,您需要构建三件事:注释、BeanProcessor和一个回调来执行您的逻辑(如果已注释)。下面是一个示例及其工作原理:

    1-创建注释

    @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中的自定义注释和处理器

    我不知道你想要什么或你需要什么,但我会给出一个通用的例子

    您有两种选择:

    • 豆处理器
    • 手持拦截器
    豆处理器 基本上,您需要构建三件事:注释、BeanProcessor和一个回调来执行您的逻辑(如果已注释)。下面是一个示例及其工作原理:

    1-创建注释

    @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的,所以您可以