使用Jackson解码JSON时的验证问题

6
我收到一个JSON编码的字符串,然后将其解码为POJO,就像这样:
String json = ...

final ObjectMapper mapper = new ObjectMapper();
MyPojo obj  = mapper.readValue(json, MyPojo.class);

我希望能够验证这个输入,但我不确定做法是否正确。
假设 MyPojo 的定义如下:

@JsonIgnoreProperties(ignoreUnknown=true)
class MyPojo {
    public static enum Type {
        One,
        Two,
        Three;

        @JsonValue
        public String value() {
            return this.name().toLowerCase();
        }
    }

    private String id;
    private Type type;
    private String name;

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Type getType() {
        return this.type;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我需要验证三件事情:
  1. 所有成员都有值;
  2. 枚举值在枚举中;
  3. 测试某些或所有值是否符合某些标准(例如:最小或最大长度、最小或最大数值、正则表达式等)。
如果验证失败,我希望返回一个有意义且易读的信息。对于第一和第三个问题,我可以简单地检查对象的所有成员,看看是否有任何成员为空,如果不为空,则根据标准进行测试,但是当有许多字段时,这种方法可能变得冗长和复杂。
至于第二个问题,如果输入的值与枚举值不匹配,则会引发一个 JsonMappingException 异常,因此我设法解决了这个问题。
try {
    MyPojo obj  = mapper.readValue(json, MyPojo.class);
}
catch (JsonMappingException e) {
    return "invalid value for property: " + e.getPath().get(0).getFieldName();
}

但是我该如何获取输入框中的值,以便返回:无效值:VALUE 用于属性:PROPERTY

谢谢。

1个回答

1

2
谢谢,这看起来很有趣,我会去看看,但它并不完全是我想要的...我想知道是否有一种Jackson的方式可以验证我发布的前两个问题。 - Nitzan Tomer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接