Spring Boot 静态成员注入 @Value 获取不到值 导致的NullPointerException 的 问题

1 篇文章 0 订阅
  •  下面是properties配置内容

 

#JWT 密钥
jwt.secretKey=xxxxxfdsfxxx
jwt.accessTokenExpireTime= PT2H
jwt.refreshTokenExpireTime= P30D
jwt.issuer=yingxue.com
  •  首先这样子注入是行不通的是获取不到值的
public class JwtTokenUtil {
    @Value("${jwt.secretKey}")
    private static String secretKey;
    @Value("${jwt.accessTokenExpireTime}")
    private static Duration accessTokenExpireTime;
    @Value("${jwt.refreshTokenExpireTime}")
    private static Duration refreshTokenExpireTime;
    @Value("${jwt.issuer}")
    private static String  issuer; 

/**
     * 生成 access_token
     * @Author:      小霍
     * @CreateDate:  2019/9/26 10:22
     * @UpdateUser:
     * @UpdateDate:  2019/9/26 10:22
     * @Version:     0.0.1
     * @param subject
     * @param claims
     * @return       java.lang.String
     * @throws
     */
    public static String getAccessToken(String subject,Map<String,Object> claims){

        return generateToken(issuer,subject,claims,accessTokenExpireTime.toMillis(),secretKey);
    }

    /**
     * 签发token
     * @Author:      小霍
     * @CreateDate:  2019/9/7 20:42
     * @UpdateUser:
     * @UpdateDate:  2019/9/7 20:42
     * @Version:     0.0.1
     * @param issuer 签发人
     * @param subject 代表这个JWT的主体,即它的所有人 一般是用户id
     * @param claims 存储在JWT里面的信息 一般放些用户的权限/角色信息
     * @param ttlMillis 有效时间(毫秒)
     * @return       java.lang.String
     * @throws
     */
    public static String generateToken(String issuer, String subject,Map<String, Object> claims, long ttlMillis,String secret) {

        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        byte[] signingKey = DatatypeConverter.parseBase64Binary(secret);

        JwtBuilder builder = Jwts.builder();
        if(null!=claims){
            builder.setClaims(claims);
        }
        if (!StringUtils.isEmpty(subject)) {
            builder.setSubject(subject);
        }
        if (!StringUtils.isEmpty(issuer)) {
            builder.setIssuer(issuer);
        }
        builder.setIssuedAt(now);
        if (ttlMillis >= 0) {
            long expMillis = nowMillis + ttlMillis;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);
        }
        builder.signWith(signatureAlgorithm, signingKey);
        return builder.compact();
    }        
}
  • 们可以改成这样
@Component
public class JwtTokenUtil {
    
    private static String secretKey;
    
    private static Duration accessTokenExpireTime;
   
    private static Duration refreshTokenExpireTime;
    
    private static String  issuer; 
    
    @Value("${jwt.secretKey}")
     public void setSecretKey(String secretKey){
        secretKey=secretKey;
    }
    @Value("${jwt.accessTokenExpireTime}")
    public void setAccessTokenExpireTime(Duration accessTokenExpireTime){
        accessTokenExpireTime=accessTokenExpireTime;
    }
    @Value("${jwt.refreshTokenExpireTime}")
    public void setRefreshTokenExpireTime(Duration refreshTokenExpireTime){
        refreshTokenExpireTime=refreshTokenExpireTime;
    }
    @Value("${jwt.issuer}")
    public void setIssuer(String issuer){
        issuer=issuer;
    }

/**
     * 生成 access_token
     * @Author:      小霍
     * @CreateDate:  2019/9/26 10:22
     * @UpdateUser:
     * @UpdateDate:  2019/9/26 10:22
     * @Version:     0.0.1
     * @param subject
     * @param claims
     * @return       java.lang.String
     * @throws
     */
    public static String getAccessToken(String subject,Map<String,Object> claims){

        return generateToken(issuer,subject,claims,accessTokenExpireTime.toMillis(),secretKey);
    }

    /**
     * 签发token
     * @Author:      小霍
     * @CreateDate:  2019/9/7 20:42
     * @UpdateUser:
     * @UpdateDate:  2019/9/7 20:42
     * @Version:     0.0.1
     * @param issuer 签发人
     * @param subject 代表这个JWT的主体,即它的所有人 一般是用户id
     * @param claims 存储在JWT里面的信息 一般放些用户的权限/角色信息
     * @param ttlMillis 有效时间(毫秒)
     * @return       java.lang.String
     * @throws
     */
    public static String generateToken(String issuer, String subject,Map<String, Object> claims, long ttlMillis,String secret) {

        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        byte[] signingKey = DatatypeConverter.parseBase64Binary(secret);

        JwtBuilder builder = Jwts.builder();
        if(null!=claims){
            builder.setClaims(claims);
        }
        if (!StringUtils.isEmpty(subject)) {
            builder.setSubject(subject);
        }
        if (!StringUtils.isEmpty(issuer)) {
            builder.setIssuer(issuer);
        }
        builder.setIssuedAt(now);
        if (ttlMillis >= 0) {
            long expMillis = nowMillis + ttlMillis;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);
        }
        builder.signWith(signatureAlgorithm, signingKey);
        return builder.compact();
    }        
}
  • 我们还可以改成这样用代理来初始化
    • 创建一个javaBean 注入配置信息
@Configuration
@ConfigurationProperties(prefix = "jwt")
@Data
public class TokenSettings {
    private String secretKey;
    private Duration accessTokenExpireTime;
    private Duration refreshTokenExpireTime;
    private String  issuer;
}
  • 修改 JwtTokenUtil



@Slf4j
public class JwtTokenUtil {

    private static String secretKey;
    private static Duration accessTokenExpireTime;
    private static Duration refreshTokenExpireTime;
    private static String  issuer;

    public static void setTokenSettings(TokenSettings tokenSettings){
        secretKey=tokenSettings.getSecretKey();
        accessTokenExpireTime=tokenSettings.getAccessTokenExpireTime();
        refreshTokenExpireTime=tokenSettings.getRefreshTokenExpireTime();
        issuer=tokenSettings.getIssuer();
    }
    /**
     * 生成 access_token
     * @Author:      小霍
     * @CreateDate:  2019/9/26 10:22
     * @UpdateUser:
     * @UpdateDate:  2019/9/26 10:22
     * @Version:     0.0.1
     * @param subject
     * @param claims
     * @return       java.lang.String
     * @throws
     */
    public static String getAccessToken(String subject,Map<String,Object> claims){

        return generateToken(issuer,subject,claims,accessTokenExpireTime.toMillis(),secretKey);
    }
    /**
     * 生产 refresh_token
     * @Author:      小霍
     * @CreateDate:  2019/9/26 10:24
     * @UpdateUser:
     * @UpdateDate:  2019/9/26 10:24
     * @Version:     0.0.1
     * @param subject
     * @param claims
     * @return       java.lang.String
     * @throws
     */
    public static String getRefreshToken(String subject,Map<String,Object> claims){
        return generateToken(issuer,subject,claims,refreshTokenExpireTime.toMillis(),secretKey);
    }
    /**
     * 签发token
     * @Author:      小霍
     * @CreateDate:  2019/9/7 20:42
     * @UpdateUser:
     * @UpdateDate:  2019/9/7 20:42
     * @Version:     0.0.1
     * @param issuer 签发人
     * @param subject 代表这个JWT的主体,即它的所有人 一般是用户id
     * @param claims 存储在JWT里面的信息 一般放些用户的权限/角色信息
     * @param ttlMillis 有效时间(毫秒)
     * @return       java.lang.String
     * @throws
     */
    public static String generateToken(String issuer, String subject,Map<String, Object> claims, long ttlMillis,String secret) {

        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        byte[] signingKey = DatatypeConverter.parseBase64Binary(secret);

        JwtBuilder builder = Jwts.builder();
        if(null!=claims){
            builder.setClaims(claims);
        }
        if (!StringUtils.isEmpty(subject)) {
            builder.setSubject(subject);
        }
        if (!StringUtils.isEmpty(issuer)) {
            builder.setIssuer(issuer);
        }
        builder.setIssuedAt(now);
        if (ttlMillis >= 0) {
            long expMillis = nowMillis + ttlMillis;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);
        }
        builder.signWith(signatureAlgorithm, signingKey);
        return builder.compact();
    }
    
   
    
    




}
  • 创建一个代理类直接初始化静态变量
@Component
public class StaticInitializerUtil {
   private TokenSettings tokenSettings;

    public StaticInitializerUtil(TokenSettings tokenSettings) {
        JwtTokenUtil.setTokenSettings(tokenSettings);
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值