关键字:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
问题代码
@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {
// 1.校验手机号与验证码
String phone = loginForm.getPhone();
String code = loginForm.getCode();
String redisCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
// 2.校验失败返回信息
if (redisCode == null || !redisCode.equals(code)) {
return Result.fail("手机号或验证码有误,请重新输入!");
}
// 生成token
String token = UUID.randomUUID().toString(true);
// 3.根据手机号查询用户是否注册
User user = query().eq("phone", phone).one();
if (null == user) {
// 4.没有注册,创建新用户
user = createUserWithPhone(phone);
}
// System.out.println(user.toString());
// 5.已经存在,登陆,将信息保存到session中
// session.setAttribute("user", BeanUtil.copyProperties(user, UserDTO.class));
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
Map<String, Object> userMap = BeanUtil.beanToMap(userDTO);
System.out.println(userMap);
String tokenKey = LOGIN_USER_KEY + token;
stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);
return Result.ok(token);
}
stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
这一段代码报错,原因是:UserDTO中的id字段是long类型,经过转换后,id还是long,所以在插入redis时不是字符串,所以报错
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
增加一段代码,将map中的值全部变成String类型
map.forEach((key, value) -> {
if (null != value) map.put(key, String.valueOf(value));
});
代码来源:map遍历代码
修改后的完整代码如下:
@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {
// 1.校验手机号与验证码
String phone = loginForm.getPhone();
String code = loginForm.getCode();
String redisCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
// 2.校验失败返回信息
if (redisCode == null || !redisCode.equals(code)) {
return Result.fail("手机号或验证码有误,请重新输入!");
}
// 生成token
String token = UUID.randomUUID().toString(true);
// 3.根据手机号查询用户是否注册
User user = query().eq("phone", phone).one();
if (null == user) {
// 4.没有注册,创建新用户
user = createUserWithPhone(phone);
}
// System.out.println(user.toString());
// 5.已经存在,登陆,将信息保存到session中
// session.setAttribute("user", BeanUtil.copyProperties(user, UserDTO.class));
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
Map<String, Object> userMap = BeanUtil.beanToMap(userDTO);
System.out.println(userMap);
String tokenKey = LOGIN_USER_KEY + token;
userMap.forEach((key, value) -> {
if (null != value) userMap.put(key, String.valueOf(value));
});
stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);
return Result.ok(token);
}