首页IT科技cannotuseaccessory翻译(全网详细解决Cannot deserialize instance of `com.xxx.实体类`out of START_ARRAY token at [Source: (PushbackInpu)

cannotuseaccessory翻译(全网详细解决Cannot deserialize instance of `com.xxx.实体类`out of START_ARRAY token at [Source: (PushbackInpu)

时间2025-05-05 03:22:59分类IT科技浏览3194
导读:1. 复现错误 今天写完页面按钮排序接口,如下代码所示:...

1. 复现错误

今天写完页面按钮排序接口          ,如下代码所示:

@ApiOperationSupport(author = "super先生", order = 8) @ApiOperation(value = "页面按钮排序") @PostMapping("/sort/pageButton") public ReturnResult sortPageButton( @Validated @RequestBody SortPageButtonDto sortPageButtonDto, BindingResult bindingResult) { BindingParamUtil.checkParam(bindingResult); return appPageButtonService.sortPageButton(sortPageButtonDto); }

使用postman测试时                ,却报出如下图错误:

此时      ,立即查看控制台报出的错误信息          ,如下代码所示:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.xxx.SortPageButtonDto` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.xxx.SortPageButtonDto` out of START_ARRAY token at [Source: (PushbackInputStream); line: 1, column: 1] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:389) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:342) at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:185) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at com.github.xiaoymin.knife4j.spring.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:87) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ......

由于错误信息较多               ,我们提取主要的错误信息      ,即Cannot deserialize instance of com.xxx.SortPageButtonDto out of START_ARRAY token at [Source: (PushbackInputStream); line: 1, column: 1]

2. 分析错误

正赶上最近ChatGPT比较火     ,借助它来帮助我分析错误               ,如下图所示:

ChatGPT什么都没有返回           ,即无法理解我的问题     ,看来               ,只能通过我自己去排查错误了           。

再次看错误信息Cannot deserialize instance of com.xxx.SortPageButtonDto out of START_ARRAY token           ,将它简单地翻译成中文就是无法反序列化SortPageButtonDto类的实例                。

为什么无法反序列化SortPageButtonDto类的实例呢?

首先,去排查SortPageButtonDto类               ,如下代码所示:

@AllArgsConstructor @NoArgsConstructor @Data @ApiModel(description = "页面按钮排序请求类") public class SortPageButtonDto { @Size(min = 1) @ApiModelProperty(name = "sortPageButtons", value = "页面按钮请求参数", required = true) private List<SortPageButton> sortPageButtons; @ApiModel(description = "查询条件请求类") @Data public class SortPageButton { @NotNull(message = "id不能为空") @ApiModelProperty(name = "id", value = "页面按钮id", required = true, example = "1") private Long id; @NotNull(message = "排序值不能为空") @ApiModelProperty(name = "seq", value = "排序值", required = true, example = "1") private Long seq; } }

此SortPageButtonDto类是用来接收前端传的数组格式的参数                ,如下代码:

[ { "id": 1, "seq": 20 }, { "id": 2, "seq": 21 } ]

因而,我在SortPageButtonDto类中          ,又定义一个SortPageButton内部类     。而SortPageButton类作为SortPageButtonDto类的属性                ,从而来接收前端传的数组     。

这样写并没有问题      ,但却报出上面的错误          ,于是到处查找资料                。

有资料说               ,上述json格式存在问题      ,需要修改成如下格式:

{ "sortPageButtonDto": [ { "id": 1, "seq": 20 }, { "id": 2, "seq": 21 } ] }

修改成如上格式后     ,再次使用postman调用页面按钮排序接口          。虽然不报错了               ,但是后端接不到参数           ,也就是null值     ,如下图所示:

既然上述方法行不通               ,那就使用如下方法解决     。

3. 解决问题

尝试修改SortPageButtonDto类           ,删除SortPageButton内部类,如下代码所示:

@AllArgsConstructor @NoArgsConstructor @Data @ApiModel(description = "页面按钮排序请求类") public class SortPageButtonDto { @NotNull(message = "id不能为空") @ApiModelProperty(name = "id", value = "页面按钮id", required = true, example = "1") private Long id; @NotNull(message = "排序值不能为空") @ApiModelProperty(name = "seq", value = "排序值", required = true, example = "1") private Long seq; }

同时               ,修改上文起始/sort/pageButton的接口代码                ,如下所示:

@ApiOperationSupport(author = "super先生", order = 8) @ApiOperation(value = "页面按钮排序") @PostMapping("/sort/pageButton") public ReturnResult sortPageButton( @Validated @RequestBody List<SortPageButtonDto> sortPageButtonDto, BindingResult bindingResult) { BindingParamUtil.checkParam(bindingResult); return appPageButtonService.sortPageButton(sortPageButtonDto); }

此时,重新启动项目          ,并再次使用postman测试                ,仍旧报出同样的错误      ,如下图所示:

将上图中的json格式的请求参数          ,恢复成起始请求的json格式               ,再次向后端发送请求      ,如下图所示:

从上图可以清晰地看到     ,如上修改后               ,后端可成功地接收到前端传的数组参数                。

经过反复尝试之后           ,终于解决了这个错误     ,如释重负般地关上电脑               ,下班回家          。

4. 文末总结

出现这种错误           ,一般是后端使用集合或数组来接收前端的参数,如下代码所示:

//集合接参 @Size(min = 1) @ApiModelProperty(name = "sortPageButtons", value = "页面按钮请求参数", required = true) private List<SortPageButton> sortPageButtons; //数组接参 @Size(min = 1) @ApiModelProperty(name = "sortPageButtons", value = "页面按钮请求参数", required = true) private SortPageButton[] sortPageButtons;

但由于传参不规范               ,导致Jackson解析数据时                ,无法拿到实际的参数值,从而报出上述的错误。

因而          ,在解决该错误时                ,前后端需要配合修改                。不然后端修改了      ,前端没有修改          ,依然会报出上述错误               。

声明:本站所有文章               ,如无特殊说明或标注      ,均为本站原创发布。任何个人或组织     ,在未征得本站同意时               ,禁止复制           、盗用                、采集     、发布本站内容到任何网站     、书籍等各类媒体平台           。如若本站内容侵犯了原著者的合法权益           ,可联系我们进行处理               。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
目前linux安装软件的方式有哪几种(在Linux中安装是使用系统性能监控软件Nmon)