【发布时间】:2020-11-28 05:30:45
【问题描述】:
这是我的课:
@Builder
@Value
public class A {
int id;
String name;
@NonNull String lastName;
}
Lombok @Builder 将添加 all args 构造函数。
我需要将一个字符串反序列化为一个 POJO 对象。
我创建了以下包含所有三个属性的 Jackson mixin:
public abstract class AMixin {
public AMixin(@JsonProperty("name") String name,
@JsonProperty("id") int id,
@JsonProperty("lastName") String lastName) {
}
@JsonProperty("name")
abstract String getName();
@JsonProperty("id")
abstract int getId();
@JsonProperty("lastName")
abstract String getLastName();
}
我这样反序列化:
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(A.class, AMixin.class);
String ss = "{\"id\":1,\"name\":\"some name\",\"lastName\":\"some name\"}\n";
A c = mapper.readValue(ss, A.class);
}
但我收到此错误:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.bla.test.A` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"id":1,"name":"some name","lastName":"some name"}
"; line: 1, column: 2]
【问题讨论】:
-
您是否尝试添加 @NoArgsConstructor ?如果它不起作用,请检查这个stackoverflow.com/questions/51464720/…
-
@TraychoIvanov 我不想要没有参数的构造函数。我的类是最终的,它的所有字段都是最终的,必须在启动阶段(构造函数)声明
-
在这种情况下,您需要使用
@JsonDeserialize的这种方法,这里有一个很好的例子 stackoverflow.com/a/48801237/9671280 -
@TraychoIvanov 混合的整个想法是避免在你的 POJO 中添加 Jackson 注释,所以我想知道为什么我的混合不起作用。
标签: java jackson lombok jackson-databind