攔截器在實例化時,需要注入的類還未進行初始化,所以獲取到的值爲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);
// 此處就可以調用實例方法了
}
}