代码如下: 在拦截器里面注入一个CatalogService catalogService,调试发现是null

  1. package top.bowen.interceptor;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.ModelAndView;
  7. import top.bowen.pojo.Catalogs;
  8. import top.bowen.service.CatalogService;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.util.HashMap;
  12. @Component
  13. public class GlobalParamsInterceptor implements HandlerInterceptor {
  14. @Autowired
  15. CatalogService catalogService;
  16. @Override
  17. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  18. return true;
  19. }
  20. @Override
  21. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  22. /**
  23. * 全局添加分类信息
  24. */
  25. HashMap<Integer, Catalogs> catalogsHashMap = catalogService.catalogsHashMapList();
  26. request.setAttribute("catalogsHashMap",catalogsHashMap);
  27. }
  28. @Override
  29. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  30. }
  31. }

原因:

后面查资料发现
造成null的原因是因为拦截器加载是在springcontext创建之前完成的,所以在拦截器中注入实体自然就为null。
一般都是因为除了在拦截器之外,还需要在拦截器的配置类中,注册拦截器时没有使用spring的bean,而是使用了new创建bean造成的。

解决

解决方法就是让bean提前加载,将配置信息修改为如下:
不通过new 的方式创建GlobalParamsInterceptor而是自动注入,这样他就成了Spring的一个bean
关键代码:
@Autowired
private GlobalParamsInterceptor globalParamsInterceptor;

  1. package top.bowen.config;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  6. import top.bowen.interceptor.GlobalParamsInterceptor;
  7. @Configuration
  8. public class WebMvcConfig implements WebMvcConfigurer {
  9. @Autowired
  10. private GlobalParamsInterceptor globalParamsInterceptor; **
  11. @Override
  12. public void addInterceptors(InterceptorRegistry registry) {
  13. /**
  14. * 拦截器按照顺序执行
  15. */
  16. /**
  17. * 不需要登录拦截的url
  18. */
  19. final String[] notLoginInterceptPaths = {"/static/**", "/error"};
  20. registry.addInterceptor(globalParamsInterceptor).addPathPatterns("/**")
  21. .excludePathPatterns(notLoginInterceptPaths);
  22. }
  23. }