说明:
这两个放一起是因为同一个需求里的 ,最近要做一个下载excel的日志记录任务,因为下载Excel是早就做好了的 所以要求对原有方法尽量少的改动。我就想着用拦截器去实现
在目标方法执行完之后区进行日志的记录。需要记录下载的文件名 我是把需要拦截的url和文件名放到了配置文件的map里key是url,value是文件名。所以第一个问题就是
拦截器无法注入bean
@Configuration
public class AllInterceptor implements WebMvcConfigurer {
/*@Bean
AdminInterceptor adminInterceptor() {
return new AdminInterceptor();
}*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册AdminInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new AdminInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
}
}
public class AdminInterceptor implements HandlerInterceptor {
@Autowired
Emp emp;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(emp);
}
}
下面是结果 可以看到bean无法注入进来
解决办法 提前注入bean
@Configuration
public class AllInterceptor implements WebMvcConfigurer {
@Bean
AdminInterceptor adminInterceptor() {
return new AdminInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册AdminInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(adminInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
}
}
结果:
第二个问题:读取配置文件map数据时 key如果有/这种特殊字符会被过滤掉 此时配置文件时yml格式
如图:
解决办法改用properties格式配合@Value使用
下面是实体:
@PropertySource(value= {"classpath:emp.properties"})
@Component
public class Emp {
@Value("#{${checkSql}}")
private Map<String, String> checkSql;
public Map<String, String> getCheckSql() {
return checkSql;
}
public void setCheckSql(Map<String, String> checkSql) {
this.checkSql = checkSql;
}
}
结果: