自己学习工程中遇到这个问题,记录下来
参考了这位老师的博客https://www.cnblogs.com/weknow619/p/8549566.html
造成null的原因是因为拦截器加载是在springcontext创建之前完成的,所以在拦截器中注入实体自然就为null
报错的写法
@Autowired回空指针
拦截器
package com.jsong.wiki.backend.interceptor;
import com.jsong.wiki.backend.bean.CookieProperties;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
@Log4j2
public class CommonInterceptor implements HandlerInterceptor {
// interceptor 里的注入为空指针,因为拦截器实在springcontext创建之前的
@Autowired
private CookieProperties cookieProperties;
/**
* 跨域拦截器
*
* @param request
* @param response
* @param handler
* @return boolean
* @date 2020/2/27 21:56
* @author Jsong
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("拦截器");
response.setHeader("Access-Control-Allow-Origin", "null");
// Cookie cookie = new Cookie("front-url", request.getHeader("front-url"));
// response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
cookies[i].setPath(cookieProperties.getPath());
cookies[i].setDomain(cookieProperties.getDomain());
response.addCookie(cookies[i]);
}
// response.setHeader("Access-Control-Allow-Origin", "http://localhost:28080");
if (request.getMethod().equals("OPTIONS")) {
response.addHeader("Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH");
response.addHeader("Access-Control-Allow-Headers", "Content-Type,Accept,Authorization");
}
return true;
}
}
配置
package com.jsong.wiki.backend.config;
import com.jsong.wiki.backend.interceptor.CommonInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 配置跨域拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry){
CommonInterceptor commonInterceptor = new CommonInterceptor();
registry.addInterceptor(commonInterceptor).addPathPatterns("/**");
}
}
解决后
解决办法,使用@Bean将interceptor交给sprting容器
拦截器
package com.jsong.wiki.backend.interceptor;
import com.jsong.wiki.backend.bean.CookieProperties;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@Component
@Log4j2
public class CommonInterceptor implements HandlerInterceptor {
// interceptor 里的注入为空指针,因为拦截器实在springcontext创建之前的
@Autowired
private CookieProperties cookieProperties;
/**
* 跨域拦截器
*
* @param request
* @param response
* @param handler
* @return boolean
* @date 2020/2/27 21:56
* @author Jsong
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("拦截器");
response.setHeader("Access-Control-Allow-Origin", "null");
// Cookie cookie = new Cookie("front-url", request.getHeader("front-url"));
// response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
cookies[i].setPath(cookieProperties.getPath());
cookies[i].setDomain(cookieProperties.getDomain());
response.addCookie(cookies[i]);
}
// response.setHeader("Access-Control-Allow-Origin", "http://localhost:28080");
if (request.getMethod().equals("OPTIONS")) {
response.addHeader("Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH");
response.addHeader("Access-Control-Allow-Headers", "Content-Type,Accept,Authorization");
}
return true;
}
}
配置
package com.jsong.wiki.backend.config;
import com.jsong.wiki.backend.interceptor.CommonInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/***
* 不注入bean 在commoninterceptor中
* @Autowired为null
* @date 2020/3/3 20:20
* @author Jsong
* @param
* @return com.jsong.wiki.backend.interceptor.CommonInterceptor
*/
@Bean
public CommonInterceptor commonInterceptor(){
return new CommonInterceptor();
}
/**
* 配置跨域拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry){
// CommonInterceptor commonInterceptor = new CommonInterceptor();
// registry.addInterceptor(commonInterceptor).addPathPatterns("/**");
registry.addInterceptor(commonInterceptor()).addPathPatterns("/**");
}
}