拦截器在实例化时,需要注入的类还未进行初始化,所以获取到的值为null。
三种方式解决这个问题,我都试过,可以放心使用。
application.properties文件增加配置:
app.appId=springboot
app.secretKey=key0123456789123
app.secretIv=iv01234567891234
新建类AppProperties:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "app")
// PropertySource默认取application.properties
// @PropertySource(value = "config.properties")
public class AppProperties {
private String appId;
private String secretKey;
private String secretIv;
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getSecretIv() {
return secretIv;
}
public void setSecretIv(String secretIv) {
this.secretIv = secretIv;
}
}
一、方式一
拦截器代码:
import com.dling.springboot.config.AppProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
public class DataInterceptor implements HandlerInterceptor {
@Autowired
private AppProperties appProperties;
// 重写的三个方法省略....
}
配置类:
import com.dling.springboot.interceptor.DataInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter {
@Bean
public HandlerInterceptor getDataInterceptor(){
return new DataInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getDataInterceptor()).addPathPatterns("/**");
}
}
二、方式二
拦截器:
import com.dling.springboot.config.AppProperties;
import org.springframework.web.servlet.HandlerInterceptor;
public class DataInterceptor implements HandlerInterceptor {
private AppProperties appProperties;
public DataInterceptor(AppProperties appProperties) {
this.appProperties = appProperties;
}
// 重写的三个方法省略....
}
配置类:
import com.dling.springboot.config.AppProperties;
import com.dling.springboot.interceptor.DataInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter {
@Autowired
private AppProperties appProperties;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new DataInterceptor(appProperties)).addPathPatterns("/**");
}
}
三、方式三 (相对简洁)
拦截器:
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dling.springboot.config.AppProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
public class DataInterceptor implements HandlerInterceptor {
// 在请求执行前执行的方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
AppProperties appProperties = applicationContext.getBean(AppProperties.class);
// 此处就可以调用实例方法了
}
}