Jackson反序列化问题: java.util.LinkedHashMap cannot be cast to xx

转化对象带泛型时,必须使用 new TypeReference进行包装

正确写法

正确写法

	@RequestMapping("test2")
	public String test2() throws JsonProcessingException {
		ObjectMapper objectMapper = new ObjectMapper();
		Result<Result<User>> result = objectMapper.readValue("{\n" +
				"    \"data\": {\n" +
				"        \"data\": {\n" +
				"            \"username\": \"yq\"\n" +
				"        },\n" +
				"        \"msg\": \"test2\"\n" +
				"    },\n" +
				"    \"msg\": \"test1\"\n" +
				"}", new TypeReference<Result<Result<User>>>() {
		});
		log.info("result: {}",result);
		log.info("username: {}",result.getData().getData().getUsername());
		return "success";
	}

运行结果

2022-03-01 01:27:32.482  INFO 35456 --- [nio-8080-exec-1] xyz.yq56.read.controller.TestController  : result: Result(data=Result(data=User(username=yq), msg=test2), msg=test1)
2022-03-01 01:27:32.483  INFO 35456 --- [nio-8080-exec-1] xyz.yq56.read.controller.TestController  : username: yq

错误写法

错误写法,编译不会报错,完整信息也能正确打出来.但是当你访问泛型对象属性时,就会报错java.util.LinkedHashMap cannot be cast to xxx

	@RequestMapping("test3")
	public String test3() throws JsonProcessingException {
		ObjectMapper objectMapper = new ObjectMapper();
		Result<Result<User>> result = objectMapper.readValue("{\n" +
				"    \"data\": {\n" +
				"        \"data\": {\n" +
				"            \"username\": \"yq\"\n" +
				"        },\n" +
				"        \"msg\": \"test2\"\n" +
				"    },\n" +
				"    \"msg\": \"test1\"\n" +
				"}", Result.class);
		log.info("result: {}",result);
		log.info("username: {}",result.getData().getData().getUsername());
		return "success";
	}

运行结果:

2022-03-01 01:33:43.820  INFO 20936 --- [nio-8080-exec-3] xyz.yq56.read.controller.TestController  : result: Result(data={data={username=yq}, msg=test2}, msg=test1)
2022-03-01 01:33:43.830 ERROR 20936 --- [nio-8080-exec-3] 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 xyz.yq56.read.model.Result] with root cause

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to xyz.yq56.read.model.Result
	at xyz.yq56.read.controller.TestController.test3(TestController.java:59) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_281]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_281]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_281]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_281]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.37.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.37.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.37.jar:9.0.37]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值