Java 8 Jackson验证


问题内容

我有一个springboot休息服务。用户传入一个json对象,该对象反序列化到此java pojo中:

public final class Request {
    private String id;
    private double code;
    private String name;

    public String getId() {
        return id;
    }

    public double getCode() {
        return code;
    }

    public String getName() {
        return name;
    }
}

因此,用户需要传递以下json:

{
    "id": “123457896”,
    "code": "Foo",
    "name": "test"
}

我想将所有这些字段都设为必填项。提供更少或更多的东西将引发异常。反序列化时,有没有办法告诉杰克逊验证输入?我已经尝试过了,@JsonProperty(required=true)但这是行不通的。显然,从这里这里似乎JsonProperty都没有遵守注释。

我在控制器中调用了这个验证器:

@Component
public class RequestValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return false;
    }

    @Override
    public void validate(Object target, Errors errors) {
        String id = ((Request) target).getId();
        if(id == null || id.isEmpty()) {
            throw new InvalidRequestException("A valid id is missing. Please provide a non-empty or non-null id.");
        }
    }
}

但这在每个领域都显得乏味且丑陋。因此,鉴于我正在使用Java 8,Spring
Boot和最新版本的Jackson,在验证传入的json输入方面的最佳实践是什么?还是我已经以最新的方式进行了?


问题答案:

您使用了Spring Validator方法。还有另一种方法:

J2EE JSR-303 / JSR-349 Bean验证API。它提供验证注释(javax,而不是jackson)。

这里看到两个很好的例子