【问题标题】:How to deserialize an array object in spring boot如何在spring boot中反序列化数组对象
【发布时间】:2019-02-01 10:40:02
【问题描述】:

我的问题很简单,我有一个 spring boot 控制器,它可以像这样接收一组对象:

@RequestMapping(value = "/contracts/{id}/milestones", method = RequestMethod.PUT, headers = "Accept=application/json")
    @ResponseBody
    @Transactional
    public ResponseEntity<?> updateContractMilestones(@PathVariable("id") String contractId,
            @DTO(MilestoneUpdateStateDto.class) List<Milestone> milestones,UriComponentsBuilder uriComponentsBuilder, final HttpServletRequest request) {
}

但是当我发送以下 Json 对象时:

[{"id":18,"state":"FINALIZED"},{"id":19,"state":"FINALIZED"}]

我收到以下错误:

读取 HTTP 消息失败: org.springframework.http.converter.HttpMessageNotReadableException: JSON 解析错误:无法反序列化 com.espiritware.opusclick.dto.MilestoneUpdateStateDto 出 START_ARRAY 令牌;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:不能 反序列化实例 com.espiritware.opusclick.dto.MilestoneUpdateStateDto 出 START_ARRAY 令牌

我的问题是我应该从后端做些什么才能正确接收这个对象?

非常感谢!

【问题讨论】:

  • 能否指定@DTO注解的全名?
  • Spring Boot 中没有 DTO 注释。您可能正在使用 auth0.com/blog/… 中描述的方法。在这种情况下,您需要调整 DTOModelMapper 以便它也可以与列表一起使用。
  • JSON 应该以{ 开头并以} 结尾
  • @RomanKonoval 如何调整 DTOModelMapper 以处理列表?非常感谢!

标签: java json spring spring-boot


【解决方案1】:

将您的方法签名更新为

@RequestMapping(value = "/contracts/{id}/milestones", method = RequestMethod.PUT, headers = "Accept=application/json")
@ResponseBody
@Transactional
public ResponseEntity<?> updateContractMilestones(
    @PathVariable("id") String contractId, 
    List<MilestoneUpdateStateDto> milestones,
    ...
)

并尝试使用此 JSON

{
 [
  {"id":18, "state":"FINALIZED"},
  {"id":19, "state":"FINALIZED"}
 ]
}

【讨论】:

  • 你忘了@RequestBody吗?
  • 我只是想指出确切的区域,是的,@RequestBody 是必需的。我会更新的
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 2021-02-18
  • 2021-12-21
  • 2018-04-08
  • 2021-06-08
  • 2019-07-17
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多