spring Jackson反序列化错误:MismatchedInputException

mtb9vblg  于 2023-09-29  发布在  Spring
关注(0)|答案(3)|浏览(391)

我有下面的课

public class Cart {
    private final String id;

    public Cart(String id) { this.id = id;}

    public String getId() { return id; }
}

以及以下测试:

String jsonString = "{\"id\":\"56c7b5f7-115b-4cb9-9658-acb7b849d5d5\"}";
    Cart cart = mapper.readValue(jsonString, Cart.class);
    assertThat(cart.getId()).isEqualTo("56c7b5f7-115b-4cb9-9658-acb7b849d5d5");

我得到以下错误:
com.fasterxml.Jackson.databind.exc.MismatchedInputException:无法构造com.store.domain.model.Cart的示例(尽管至少存在一个Creator):无法从[Source:"{“id”:“56c7b5f7-115b-4cb9-9658-acb7b849d5d5”}";行:1,列:2]
我不知道这里出了什么问题。有什么需要帮忙的吗?

qojgxg4l

qojgxg4l1#

你应该像这样添加一个没有任何参数的普通构造函数:

public Cart() { }
dpiehjr4

dpiehjr42#

您需要将bean定义为:

public class Cart {
    private final String id;

    @JsonCreator
    public Cart(@JsonProperty("id") String id) { this.id = id;}

    public String getId() { return id; }
}

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    String jsonString = "{\"id\":\"56c7b5f7-115b-4cb9-9658-acb7b849d5d5\"}";
    Cart cart = mapper.readValue(jsonString, Cart.class);
    System.out.println(mapper.writeValueAsString(cart));
}

输出

{"id":"56c7b5f7-115b-4cb9-9658-acb7b849d5d5"}

默认情况下,Jackson使用默认构造函数和setter / getter方法创建任何类的示例。
因为你的bean是不可变的。没有默认的构造函数和setter,你需要显式地告诉Jackson如何使用@JsonCreator创建Cart类的示例,以及如何使用@JsonProperty设置属性值。

llycmphe

llycmphe3#

为了解决类似的反序列化错误,当使用Kotlin数据类时,我需要在初始化ObjectMapper示例时将KotlinModule示例添加到ObjectMapper示例。

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule

fun createObjectMapper(): ObjectMapper {
    val objectMapper = ObjectMapper()
    objectMapper.registerModules(KotlinModule.Builder().build())

    return objectMapper
}

相关问题