class java.lang.Double cannot be cast to class java.lang.Integer (java.lang.Double and java.lang.Integer are in module java.base of loader 'bootstrap')
这是错误类型,Double无法强制转换为Integer
public static Claims parseJWT(String jwt){ Claims claims = Jwts.parser() .setSigningKey(signKey) .parseClaimsJws(jwt) .getBody(); return claims; }
这是jwt的解析函数
public static String generateJwt(Map<String, Object> claims){ String jwt = Jwts.builder() .addClaims(claims) .signWith(SignatureAlgorithm.HS256, signKey) .setExpiration(new Date(System.currentTimeMillis() + expire)) .compact(); return jwt; }这是生成jwt令牌的函数
log.info("员工登录{}",emp); Emp e=empService.loginEmp(emp); if(e!=null){ Map<String, Object> claims=new HashMap<>(); claims.put("id",e.getId()); claims.put("name",e.getName()); claims.put("username",e.getUsername()); String jwt=JwtUtils.generateJwt(claims); return Result.success(jwt); } return Result.error("用户名或密码错误");
这是生成jwt令牌
使用AOP统计操作日志报错,最后发现在JwtUtils.generateJwt(claims)方法中,使用了JJWT库来构建JWT令牌。JJWT库会根据存放在claims
中的值的类型来自动选择合适的方式进行编码。由于Java是强类型语言,JJWT库在编码时会将数字类型统一转换为浮点数类型(Double),以便于解码时正确还原。所以后来解析出来了一个Double,修改后为
Double idDouble = (Double) claims.get("id"); Integer operateUser = idDouble.intValue();