我有一个收到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;
}
}
有没有更好的方法可以做到这一点,因此创建和验证不会混合,但可以捕获所有非法格式错误?