【问题标题】:Getting a NullPointer instead of creating a token获取 NullPointer 而不是创建令牌
【发布时间】:2019-02-15 06:41:29
【问题描述】:

我目前正在使用 JWT 编写 Spring Boot 应用程序。测试负责使用不同日期创建令牌的功能我遇到了问题。好吧,我得到的是 NullPointer,而不是令牌。我就是这样测试的:

@Test
public void testGenerateTokenFromDifferentDates() {
    when(clockMock.now())
            .thenReturn(DateUtil.yesterday())
            .thenReturn(DateUtil.now());

    String token = createToken();
    String tokenLater = createToken();

    assertThat(token).isNotEqualTo(tokenLater);
}

private String createToken() {
    String token = tokenUtil.generateToken(new TestUser(USERNAME));
    return token;
}

这是负责创建令牌的类:

@Component
public class TokenUtil implements Serializable {
    private static final long serialVersionUID = -3301605591108950415L;
    @Value("${jwt.secret}")
    private String secret;
    private Clock clock = DefaultClock.INSTANCE;
    @Value("${jwt.expires.days}")
    private Long expiration;

    public String getUsernameFromToken(String token) {
        return getClaimsFromToken(token, Claims::getSubject);
    }

    public <T> T getClaimsFromToken(String token, Function<Claims, T> resolverClaims) {
        final Claims claims = getAllClaimsFromToken(token);
        return resolverClaims.apply(claims);
    }

    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        return doGenerateToken(claims, userDetails.getUsername());
    }

    private Claims getAllClaimsFromToken(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJwt(token).getBody();
    }

    private String doGenerateToken(Map<String, Object> claims, String subject) {
        final Date createdDate = clock.now();
        final Date expirationDate = calculateExpirationDate(createdDate);

        return Jwts.builder()
            .setClaims(claims)
            .setSubject(subject)
            .setIssuedAt(createdDate)
            .setExpiration(expirationDate)
            .signWith(SignatureAlgorithm.HS512, this.secret)
            .compact();
    }

    private Date calculateExpirationDate(Date createdDate) {
        return new Date(createdDate.getTime() + expiration * 1000);
    }
}

我想不出可能是什么原因。调试器也对我没有帮助,因为它没有到现在。这是repository。 正如@theonlyrao 建议的那样,这里是堆栈跟踪:

java.lang.NullPointerException
at com.github.springjwt.security.jwt.TokenUtil.calculateExpirationDate(TokenUtil.java:59)
at com.github.springjwt.security.jwt.TokenUtil.doGenerateToken(TokenUtil.java:47)
at com.github.springjwt.security.jwt.TokenUtil.generateToken(TokenUtil.java:38)
at com.github.springjwt.security.jwt.TokenUtilTest.createToken(TokenUtilTest.java:42)
at com.github.springjwt.security.jwt.TokenUtilTest.testGenerateTokenFromDifferentDates(TokenUtilTest.java:35)

【问题讨论】:

标签: spring-boot jwt


【解决方案1】:

似乎createdDateexpiration 都为空。

我不确定createdDate 是如何被实例化的,因为我没有使用过DefaultClock 库。

我认为expiration 的问题在于您没有告诉 Spring 在哪里寻找测试中的应用程序属性。除非代码中的其他地方发生这种情况,否则您需要指定资源的路径,如https://www.baeldung.com/spring-classpath-file-access 中所述。

【讨论】:

  • 你是对的。 @Value 注释无法从 application.properties 文件加载值。我改用ReflectionTestUtils,一切正常。感谢您的帮助。
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2019-11-23
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多