PHP技术那点事
全部
技术
PHP
MySQL
前端
Linux
JAVA
退出
编辑文章
选择分类
PHP
MySQL
前端
Linux
Java
工具
选择专栏
设计模式
java基础
Angular学习
Java面试题
描述:
封面图上传 :
+
点击上传图片
代码如下: 在拦截器里面注入一个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
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); } } ```
保存文章