gpt4 book ai didi

java - 自定义注解过滤器 Spring boot

转载 作者:行者123 更新时间:2023-12-02 01:16:49 26 4
gpt4 key购买 nike

我发现使用 Spring boot 创建过滤器非常简单。只需关注这样的帖子 https://www.baeldung.com/spring-boot-add-filter

我无法找到的是如何创建将 Controller 中的特定端点订阅到一个过滤器的注释。

类似于 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注释,但这不是我想要的。我想创建一个库,让消费者决定使用哪个过滤器,只需在 Controller 中添加注释即可。

知道如何使用 Spring boot/MVC 做类似的事情吗?

问候

最佳答案

我将尝试在这里详细描述 Spring 中的自定义注释和处理器。

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

您有 2 个选择:

  • BeanProcessor
  • 处理程序拦截器

BeanProcessor

您基本上需要构建 3 个东西:Annotaton、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);
}
}

3 - 创建方法回调(这里是要执行的逻辑)

public ReactiveMethodCallback implements MethodCallback {

private ConfigurableListableBeanFactory configurableBeanFactory;
private Object bean;

public ReactiveMethodCallback(ConfigurableListableBeanFactory bf, Object bean) {
configurableBeanFactory = bf;
this.bean = bean;
}

@Override
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
if (!method.isAnnotationPresent(Reactive.class)){
return;
}
//YOUR LOGIC HERE
}

}

这是一个关于注释处理的很好的资料,它是关于 FieldProcessing 的,但是如果您有疑问,您可以更改接口(interface)来实现您需要的内容:https://www.baeldung.com/spring-annotation-bean-pre-processor

[更新]您还可以创建一个 HandlerInterceptor:

处理程序拦截器

public class ReactiveFilterHandlerInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
Exception {

if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// Test if the controller-method is annotated with @CustomFilter
Reactive filter = handlerMethod.getMethod().getAnnotation(Reactive.class);
if (filter != null) {
// ... do the filtering, or call the Component for filtering
}
}
return true;
}
}

并注册您的处理程序:

@Configuration
public class WebMvcConfig extends WebMvcConfigurer {

@Autowired
ReactiveFilterHandlerInterceptor reactiveFilterHandlerInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(reactiveFilterHandlerInterceptor);
}
}

关于java - 自定义注解过滤器 Spring boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58435748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com