JSON / POJO验证

时间:2017-12-25 10:40:45

标签: java json hibernate validation jackson

我有一个收到JSON的服务。要求是将其解析为相应的POJO并验证其字段。

  • 解析:我正在使用杰克逊的ObjectMapper

  • 验证:我使用Hibernate Validation API (JSR-303)

    public class Person {
    
    @JsonProperty(value = "firstName", required = true)
    private final @NotBlank @Size(max = 20) String firstName;
    
    @JsonProperty(value = "lastName", required = true)
    private final @NotBlank @Size(max = 30) String lastName;
    
    @JsonProperty(value = "gender", required = true)
    private final Gender gender; // enum
    
    @JsonProperty(value = "dateOfBirth", required = true)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd")
    private final Date dateOfBirth;
    
    // ctor and getters
    }
    

我有一个工厂类,应该从POJO创建JSON个对象。

public class PersonFactory {

    private ObjectMapper mapper = new ObjectMapper(); // plus all the setup

    public Person createFromJson(JsonNode json) throws JsonProcessingException {
        return mapper.treeToValue(json, Person.class);
    }   
}

验证对象并验证对象并创建自定义报告的验证器类。

public class PersonValidator {

    private static final Validator validator =
         Validation.buildDefaultValidatorFactory().getValidator();

    public PersonReport validate(Person person) {
        Set<ConstraintViolation<Person>> viols = validator.validate(); 
        // ... and the logic to create the actual PersonReport 
        // from the constraint violations result
        return report;
    }
}

这个问题是PersonReport应该包含所有发生的验证问题,这意味着两者在JSON处理过程中可能出现的问题(由JsonProcessingException包含)字段的验证。

PersonReport在验证失败的地方(处理JSON或字段验证)不应该有任何区别,并且应该将所有这些错误记录到单个报告中。

PersonValidator置于此架构中的最佳位置是什么?

类似于:

try {
    Person p = PersonFactory.createFromJson(json).withValidator(validator);
} catch (PersonParseException e) {
    PersonReport report = e.getReport();
}
好的设计?因为它将验证与创建混合在一起,但我的验证和创建逻辑都可以指示输入JSON的非法格式。

这样PersonFactory就是这样的:

public class PersonFactory {

    private ObjectMapper mapper = new ObjectMapper(); // plus all the setup

    public Person createFromJson(JsonNode json, Validator validator) throws PersonParseException {
        Person p = null;
        try {
            p = mapper.treeToValue(json, Person.class);
        } catch(JsonProcessingException e) {
            PersonReport report = createReport(e);
            throw new PersonParseException(report);
        }

        Set<ConstraintViolation<Person>> viols = validator.validate(p);

        if (viols.size() != 0) {throw new PersonParseException(createReport());}

        return person;

    }   
}

有没有更好的方法可以做到这一点,因此创建和验证不会混合,但可以捕获所有非法格式错误?

0 个答案:

没有答案