当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。foo
endpoint失败,但bar
endpoint成功
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非空检查
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对象后,我想向服务器发送一个列表 从…起 当向控制器发送对象时,它会抛出