我有以下课程
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
(尽管至少 存在一个创建者):无法从对象值反序列化(否 [资料来源: (String)“ {” id“:” 56c7b5f7-115b-4cb9-9658-acb7b849d5d5“}”;行:1 栏:2]
我不知道这里出了什么问题。有什么帮助吗?
答案 0 :(得分:2)
您需要将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是不可变的,即没有默认的构造函数和设置器,因此您需要明确告诉Jackson
如何使用Cart
创建@JsonCreator
类的实例以及如何使用{{1}设置属性值}。
答案 1 :(得分:1)
您应该添加一个普通的构造函数,而没有这样的参数:
public Cart() { }