如何防止objectmapper成功地将普通字符串反序列化为对象?

kx7yvsdv  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(704)

我有一个简单的pojo:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StatusPojo {

  private String status;

}

当我反序列化简单字符串“asd”(不带引号)时,如下所示:

StatusPojo pojo = new ObjectMapper().readValue("asd", StatusPojo.class)

我成功地创建了一个statuspojo对象,status字段的值为“asd”,尽管它不是有效的json,也没有提到字段名“status”。
为什么它的行为是这样的,如何禁用此行为并让对象Map程序抛出异常?

6yt4nkrj

6yt4nkrj1#

你的pojo有 @AllArgsConstructor (也许是因为 @Builder )然后会产生这样的结果:

public StatusPojo(String status) {
    this.status = status;
}

当objectmapper然后反序列化普通字符串时,它使用该构造函数来创建对象。
如果您在pojo中添加了其他属性,例如:

private String noAsdPlease;

会有一个例外,因为objectmapper找不到创建者,所以不会有上面提到的构造函数,而是有两个字符串参数。
快速闪光 DeserializationFeature 不具有这样的功能,即禁止对普通字符串使用一个字符串参数构造函数。
玩更多的领域,删除 @Builder & @AllArgsConstructor 可能会解决你的问题,但如果你不能改变这些可能没有其他的选择。

相关问题