首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jackson未能反序列化简单的JSON

Jackson未能反序列化简单的JSON
EN

Stack Overflow用户
提问于 2021-10-08 03:12:58
回答 4查看 304关注 0票数 3

我正在使用Lombok,@注释为我创建了getter、setter和constructors。我还有很多其他的类,杰克逊很容易将它们反序列化。下面是我试图反序列化的对象:

代码语言:javascript
运行
复制
@Value
@Builder
public class RecipeListRemoveDTO {
    int recipeListId;
}

在下列控制器方法中使用:

代码语言:javascript
运行
复制
@DeleteMapping(path="/deleteRecipeListFromUser")
public @ResponseBody String deleteRecipeListFromUser(@RequestBody RecipeListRemoveDTO recipeListRemoveDTO) {
    return recipeListService.removeRecipeListFromUser(recipeListRemoveDTO);
}

我要发送的JSON:

代码语言:javascript
运行
复制
{
    "recipeListId": 2
}

但我收到了错误:

"message": "JSON parse error: Cannot construct instance of com.prepchef.backend.models.dto.RecipeListRemoveDTO (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of com.prepchef.backend.models.dto.RecipeListRemoveDTO (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (PushbackInputStream); line: 2, column: 5]"

有人知道为什么会这样吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-10-08 20:01:40

杰克逊不知道它应该使用Lombok生成的构建器。可能最简单的解决方案是用注解 (从Lombok1.18.14开始)对类进行注释。

代码语言:javascript
运行
复制
@Value
@Builder
@Jacksonized
public class RecipeListRemoveDTO {
    int recipeListId;
}

@Jacksonized注释下,Lombok执行以下操作(这样您就不需要手动执行这些操作):

  • 它将@JsonDeserialize(builder=RecipeListRemoveDTO.RecipeListRemoveDTOBuilder.class)添加到类中,以便Jackson知道它应该使用构建器进行反序列化。
  • 它将@JsonPOJOBuilder(withPrefix="")添加到构建器类中,以便杰克逊知道buillder方法的名称不是以with开头。
票数 1
EN

Stack Overflow用户

发布于 2021-10-08 07:24:51

这不起作用的原因是,当您将@Value@Builder结合使用时,不会生成public构造函数:

而且,任何显式构造函数,无论参数列表,都意味着lombok不会生成构造函数。如果希望lombok生成所有的args构造函数,那么将@AllArgsConstructor添加到类中。

将@Builder应用于类就好像将@AllArgsConstructor(access = AccessLevel.PACKAGE)添加到类中一样

因此,总之,如果您希望维护@Value提供的不可变性,那么在本例中还需要添加@AllArgsConstructor

票数 1
EN

Stack Overflow用户

发布于 2021-10-08 05:46:37

当您使用Lomboks @值注释时,不会生成Setters,这就是您在代码中获得异常的原因。相反,您应该使用@数据注释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69490052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档