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);
        // 此处就可以调用实例方法了
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值