当前位置: 首页 > 知识库问答 >
问题:

Jackson未能反序列化请求正文,因为Kotlin Spring中不存在Creator(如默认构造函数)

桓宜
2023-03-14

当Jackson请求反序列化为下面写的目标类时,我收到了错误

data class FooRequest(val param1: String)

实际上这个问题很容易通过添加@JsonProperty注释来解决,杰克逊需要一个无参数构造函数也是可以理解的。但我有点好奇,当目标类包含多个属性时,如何不发生这样的错误,例如

data class BarRequest(val param1: String, val param2: String)

下面写的完整代码

data class FooRequest(val param1: String)

data class BarRequest(val param1: String, val param2: String)

@RestController
class FooController {

    @PostMapping("/foo")
    fun foo(@RequestBody @Valid request: FooRequest) {}

    @PostMapping("/bar")
    fun bar(@RequestBody @Valid request: BarRequest) {}

}

这是成功和失败请求的CURL。fooendpoint失败,但barendpoint成功

curl --location --request POST 'http://localhost:8003/foo' \
--header 'Content-Type: application/json' \
--data-raw '{
    "param1": "value1"
}'

curl --location --request POST 'http://localhost:8003/bar' \
--header 'Content-Type: application/json' \
--data-raw '{
    "param1": "value1",
    "param2": "value2"
}'

这里还有错误消息

JSON解析错误:无法构造< code >控制器的实例。FooRequest(尽管至少存在一个创建者):无法从对象值反序列化(没有基于委托或基于属性的创建者);嵌套异常为com . faster XML . Jackson . databind . exc . mismatchedinputexception:无法构造< code >控制器的实例。FooRequest(尽管至少存在一个创建者):无法从对象值反序列化(没有基于委托或基于属性的创建者)\n位于[Source:(PushbackInputStream);第2行,第5列]

另外,如果有人问我为什么使用javax.validation@Valid注释是因为我需要确保请求不包含空白字符串,因为这种情况会通过kotlin非空检查

共有1个答案

宗乐池
2023-03-14

Kotlin无参数插件可能会帮助你。这个插件可以给类添加一个无参数的构造函数,尽管它们是数据类。

或者,您可以为每个参数指定默认值。

kotlin prettyprint-override">data class BarRequest(val param1: String = "", val param2: String = "")
 类似资料:
  • Jackson可以在2.6.5中为以下类反序列化json,但在2.8.8中失败。 型号: JSON: 例外情况是: 我发现lombok创建的子构造函数导致了这个错误。当我去掉lombok注释或手动创建构造函数时,这种情况就会停止。无论如何,它都应该使用no args Child()构造函数。是什么导致了这个问题?

  • 问题内容: 我有一个定义不可变值类型的类,现在需要对其进行序列化。不变性来自构造函数中设置的最终字段。我已经尝试过序列化,并且它可以工作(令人惊讶的是?)-但我不知道如何进行。 这是课程的一个例子 鉴于该类没有no arg构造函数,如何实例化它并设置最终字段? (顺便说一句,我注意到了该类,尤其是因为IDEA并未为此类生成“ no serialVersionUID”检查警告,但尚未为我刚刚使其可序

  • 像这样: 我该怎么办?

  • 我有一个类,它有一个默认构造函数,还有一个重载构造函数,它接受一组参数。这些参数与对象上的字段匹配,并在构造时指定。此时,我需要用于其他目的的默认构造函数,因此如果可以的话,我希望保留它。 我的问题:如果我删除默认的构造函数并传递JSON字符串,对象反序列化正确,并传递构造函数参数没有任何问题。我最终以我所期望的方式找回填充的对象。但是,一旦我将默认构造函数添加到对象中,当我调用

  • 我尝试使用以下代码反序列化API中接收的JSON对象: 我的类使用Lombok生成构造函数、getter和setter,如下所示: 这两个属性都应该是可选的,如果没有提供,则使用类定义中指定的默认值。但是,如果我现在尝试反序列化JSON 字段为。根据我的理解,以及我找到的所有示例代码,应该是一个空列表。 编辑:不是重复的,因为我使用的是没有选项的Lombok

  • 添加到DTO对象后,我想向服务器发送一个列表 从…起 当向控制器发送对象时,它会抛出