Spring-Data-Redis--解决java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to xxx
原文网址:Spring-Data-Redis--解决java.lang.ClassCastException: java.util.linkedHashMap cannot be cast to xxx_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍解决Spring-Data-Redis的“java.lang.ClassCastException: java.util.linkedHashMap cannot be cast to xxx”报错的方法。
出现的场景
SpringBoot项目中使用Redis来进行缓存。把数据放到缓存中时没有问题,但从缓存中取出来反序列化为对象时报错:“java.lang.ClassCastException: java.util.linkedHashMap cannot be cast to xxx”。(xxx为反序列化的目标对象对应的类。) 只有这个类里有其他对象字段才会报这个问题,如果这个类里都是初始的类型(比如:Integer,String)则不会报这个错误。
package com.example.demo.controller;
import com.example.demo.entity.Result;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("page")
public Result page(int pageNo, int pageSize) {
return userService.page(pageNo, pageSize);
}
}
Service
接口
package com.example.demo.service;
import com.example.demo.entity.Result;
public interface UserService {
Result page(int pageNo, int pageSize);
}
实现
package com.example.demo.service.impl;
import com.example.demo.constant.RedisConstant;
import com.example.demo.entity.Result;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
private final List allUsers = Arrays.asList(
new User(1L, "Tony1", 20),
new User(2L, "Tony2", 18),
new User(3L, "Tony3", 30),
new User(4L, "Tony4", 25),
new User(5L, "Tony5", 28)
);
@Override
@Cacheable(cacheNames = "userPageCache")
public Result> page(int pageNo, int pageSize) {
String format = String.format("pageNo: %s, pageSize: %s", pageNo, pageSize);
System.out.println("从数据库中读数据。" + format);
int from = (pageNo - 1) * pageSize;
int to = Math.min(allUsers.size(), (pageNo) * pageSize);
List users = new ArrayList<>(allUsers.subList(from, to));
return new Result>().data(users);
}
}
Entity
User
package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
// 必须要有无参构造函数。因为Redis反序列化为对象时要用到
@NoArgsConstructor
public class User {
private Long id;
private String userName;
private Integer age;
}
Result
package com.example.demo.entity;
import lombok.Data;
@Data
public class Result {
private boolean success = true;
private int code = 1000;
private String message;
private T data;
public Result() {
}
public Result(boolean success) {
this.success = success;
}
public Result success(boolean success) {
Result result = new Result<>(success);
if (success) {
result.code = 1000;
} else {
result.code = 1001;
}
return result;
}
public Result success() {
return success(true);
}
public Result failure() {
return success(false);
}
public Result code(int code) {
this.code = code;
return this;
}
public Result message(String message) {
this.message = message;
return this;
}
public Result data(T data) {
this.data = data;
return this;
}
}
2022-01-11 14:59:23.805 ERROR 68468 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.util.linkedHashMap cannot be cast to com.example.demo.entity.Result] with root cause
java.lang.ClassCastException: java.util.linkedHashMap cannot be cast to com.example.demo.entity.Result
at com.sun.proxy.$Proxy56.page(Unknown Source) ~[na:na]
at com.example.demo.controller.UserController.page(UserController.java:18) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE]
......
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.46.jar:9.0.46]
at org.apache.tomcat.util.net.SocketProcessorbase.run(SocketProcessorbase.java:49) [tomcat-embed-core-9.0.46.jar:9.0.46]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_201]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.46.jar:9.0.46]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_201]
评论列表(0条)