You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java解析JWT令牌提取自定义字段返回null的问题求助

问题根因

你生成JWT令牌时,是将整个User对象存到了key为user的自定义声明中,并没有把email、phoneNumber等字段直接放到claims的顶层,所以直接调用get("email")自然返回null。

解决方案

方案1:调整令牌生成逻辑,直接把字段放到claims顶层(更推荐)

修改generateToken方法,把User的属性直接拆分存入claims:

public String generateToken(User user) {
    Map<String, Object> claims = new HashMap<>();
    // 直接把字段存入claims顶层
    claims.put("email", user.getEmail());
    claims.put("phoneNumber", user.getPhoneNumber());
    claims.put("ppUrl", user.getProfilePicture());
    claims.put("password", user.getPassword());
    return createToken(claims);
}

调整后你原来的提取代码不需要改动,直接get("email")就能拿到对应值。

方案2:不调整生成逻辑,提取时先获取User对象再读取属性

保持现有的令牌生成逻辑不变,修改业务层的提取代码:

if (!jwtUtil.isTokenExpired(token)){
    Claims claims = jwtUtil.extractAllClaims(token);
    // 先拿到存进去的User对象,注意需要User类可序列化且JJWT能正确反序列化
    User user = claims.get("user", User.class);
    // 后续直接使用user对象的属性即可
    String encodedPassword = passwordEncoder.encode(user.getPassword());
    // ... 剩余逻辑保持不变
}

注意:如果用方案2,需要保证你的User类实现了Serializable接口,否则JJWT可能无法正确反序列化出User对象,还可能出现类型转换异常。

额外排查点

如果修改后还是拿不到值,可以先在extractAllClaims方法里打印完整的claims内容,确认生成令牌时的声明是不是真的正确存入了,同时排查是否存在生成和解析用的密钥不一致的问题,避免解析出来的内容异常。

内容的提问来源于stack exchange,提问作者Pisces1719

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:30:00