如何防止ObjectMapper成功地将纯字符串反序列化为Object



我有一个简单的POJO:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StatusPojo {
private String status;
}

当我对简单字符串"进行反序列化时;asd";(无引号(如下:

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

我正在成功创建一个StatusPojo对象,状态字段的值为";asd";,尽管它不是有效的JSON,并且没有任何地方具有字段名称";"状态";同时提到。

为什么它会这样做,以及如何禁用这种行为并让对象映射器抛出异常?

您的POJO有@AllArgsConstructor(可能是因为@Builder(,然后它会生成这样的东西:

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

当ObjectMapper反序列化纯字符串时,它会使用该构造函数来创建对象。

如果你在pojo中添加了一些其他属性,比如:

private String noAsdPlease;

会有一个例外,因为ObjectMapper找不到创建者,所以不会有上面提到的构造函数,而是有两个String参数。

在快速glace中,DeserializationFeature没有这样一个功能,即禁止为纯字符串使用一个字符串arg构造函数。

玩更多的领域,删除@Builder&@AllArgsConstructor可能会解决你的问题,但如果你不能改变这些,可能就没有其他选择了。

最新更新