代码如下: 在拦截器里面注入一个CatalogService catalogService,调试发现是null
package top.bowen.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import top.bowen.pojo.Catalogs;
import top.bowen.service.CatalogService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
@Component
public class GlobalParamsInterceptor implements HandlerInterceptor {
@Autowired
CatalogService catalogService;
@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 {
/**
* 全局添加分类信息
*/
HashMap<Integer, Catalogs> catalogsHashMap = catalogService.catalogsHashMapList();
request.setAttribute("catalogsHashMap",catalogsHashMap);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
原因:
后面查资料发现
造成null的原因是因为拦截器加载是在springcontext创建之前完成的,所以在拦截器中注入实体自然就为null。
一般都是因为除了在拦截器之外,还需要在拦截器的配置类中,注册拦截器时没有使用spring的bean,而是使用了new创建bean造成的。
解决
解决方法就是让bean提前加载,将配置信息修改为如下:
不通过new 的方式创建GlobalParamsInterceptor而是自动注入,这样他就成了Spring的一个bean
关键代码:
@Autowired
private GlobalParamsInterceptor globalParamsInterceptor;
package top.bowen.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import top.bowen.interceptor.GlobalParamsInterceptor;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private GlobalParamsInterceptor globalParamsInterceptor; **
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* 拦截器按照顺序执行
*/
/**
* 不需要登录拦截的url
*/
final String[] notLoginInterceptPaths = {"/static/**", "/error"};
registry.addInterceptor(globalParamsInterceptor).addPathPatterns("/**")
.excludePathPatterns(notLoginInterceptPaths);
}
}