SpringBoot攔截器 @Autowired注入後值爲null

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

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章