当前位置: 首页 > 知识库问答 >
问题:

如何在Spring boot应用程序中为拦截器编写自定义启用注释?

公羊雅达
2023-03-14

是否可以编写自定义启用注释以启用Spring Boot应用程序的拦截器。

这是我的密码,

配置

@Configuration
public class CustomConfig extends WebMvcConfigurerAdapter {

    @Autowired
    CustomInterceptor interceptor;

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

}

拦截器

@Component
public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

        System.err.println("Executed!!!afterCompletion");

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.err.println("Executed!!!postHandle");

    }

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        // TODO Auto-generated method stub
        return true;
    }

}

自定义批注

@Documented
@Retention(RUNTIME)
@Target(TYPE)
@Import(CustomConfig.class)
public @interface EnableCustomConfig {

}

仅当此批注

@启用CustomConfig

在主课堂上出现,

@SpringBootApplication
@EnableAutoConfiguration
@EnableCustomConfig
public class CustomEnableApplication {

    public static void main(String[] args) {
        SpringApplication.run(CustomEnableApplication.class, args);
    }
}

这可能在Spring启动中实现吗?如果是,请让我知道如何。

共有1个答案

郏扬
2023-03-14

这里有几个选项。首先,我想我会完全跳过注释。您可以简单地扩展界面:

public CustomInterceptor extends HandlerInterceptor {}

让您所需的拦截器实现此接口,并使用ApplicationContext确定哪些Springbean实现此接口

@Autowired
private ApplicationContext applicationContext;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    Map<String, CustomInterceptor> interceptors = applicationContext.getBeansOfType(CustomInterceptor.class);
    for(CustomInterceptor interceptor : interceptors.values()){
          registry.addInterceptor(interceptor);
    }
}

如果设置为使用注释,则可以使用与上述基本相同的逻辑。您可以让所有bean实现HandlerInterceptor接口,然后检查它们的注释。可以通过以下方式检查bean的注释:

public boolean isAnnotatedWithMyAnnotation(Class clazz){
    return clazz.getAnnotation(EnableCustomConfig.class) == null ? false : true;
}
 类似资料:
  • 在RestTemplate中,我有一个自定义拦截器,它将记录一些请求-响应详细信息并保存到数据库。 我的自定义拦截器: springboot中的RestTemboard bean配置: 将拦截器添加到restTemboard bean: 如何将此拦截器添加到佯装客户端? 正在应用中。yml: InterceptorOne为假装客户端中的每个请求添加标头: 但是我不能添加日志服务拦截器,因为它由于错

  • 这里是我的拦截器方法,我想在这里设置自定义响应,告诉UI发生了什么 并且在web.xml中 spring-servlet.xml 当会话超时时,它在返回false后不发送任何响应。连下面的都不行

  • 问题内容: Java专家 我很新,还没有搜索很多,所以请忍受… 我想实现一个将调用方法的方法;从最基础的东西开始,它可以只打印方法名称和参数,这样我就可以避免使用该语句。 像这样的示例调用: 可以转换为: 我可以得到一些提示吗? 问题答案: 根据您对我的评论的回答,您将无法仅凭注释来执行此操作。当然,您可以创建批注并创建一些反射代码,然后将其检测出来并执行一些代码,但这不会对代码造成太大的改变,因

  • 我正在编写一个库/sdk,它可以拦截任何使用自定义注释进行注释的方法。代码的工作方式有点像这样 截取这个的方面有一个切入点表达式 当我在与相同的包中描述方面时,此代码工作正常。但是,如果我创建一个单独的库并定义方面,因为它无法拦截。有帮助吗? 回应@Bond的评论 Spring版本:Spring上下文-4.1.7。发布aspectj-1.6.5问题的关键是注释不会在同一个项目中使用。在编译之后,它

  • 问题内容: 如何在CLI(命令行界面)Java应用程序中截获 (通常会杀死进程)? 是否存在多平台解决方案(Linux,Solaris,Windows)? 我使用的是,但是如有必要,我可以使用其他方法从标准输入中读取字符。 问题答案: 这应该能够截获信号,但是仅作为JVM完全关闭自身之前的中间步骤,因此它可能不是你要注意的。 你需要使用截获 触发的信号C(在Unix和Windows上)。

  • 本文向大家介绍SpringBoot添加自定义拦截器的实现代码,包括了SpringBoot添加自定义拦截器的实现代码的使用技巧和注意事项,需要的朋友参考一下 在Controller层时,往往会需要校验或验证某些操作,而在每个Controller写重复代码,工作量比较大,这里在Springboot项目中 ,通过继承WebMvcConfigurerAdapter,添加拦截器。 1、WebMvcConfi