我目前正在开发一个使用Play Framework 2.1.0的网络项目。 Play支持一个不错的API,用于解析表单数据并将其直接映射到Model bean。看起来像,
Form<Employee> form = Form.form(Employee.class).bindFromRequest();
if (form.hasErrors()) {
return badRequest(template.render(form));
}
此API还可以动态执行验证,并且能够处理绑定失败,比如说String无法转换为Integer。 Form API保持映射到属性名称的错误集合。在Form API的基础上,Play正在使用Spring的验证框架的DataBinder,它实际上正在做所有的魔术。
我想知道是否有类似的绑定API直接从JSON转换到bean,并支持处理绑定失败?
Play 2.0在内部使用Jackson,当存在绑定失败并且只是抛出异常时会失败。我查看了代码,看起来很容易压制这些错误。
是否有一些框架可以满足我的开箱即用要求?
本质上,我需要框架从JSON转换为Java Bean,它可以优雅地处理绑定失败。
如果它允许我在某处收集它们会很好,所以我可以生成适当的验证错误。我将使用javax.validation API对解析的对象运行自定义验证,以便在将JSON解析为Bean后执行更具体的验证。
答案 0 :(得分:1)
我通过在Jackson
中添加自定义反序列化器来实现这一目标SimpleDeserializers deserializers = new SimpleDeserializers();
deserializers.addDeserializer(Integer.class, new MyIntegerDeserializer(null));
deserializers.addDeserializer(Long.class, new MyLongDeserializer(null));
ObjectMapper mapper = new ObjectMapper().setDeserializerProvider(
new StdDeserializerProvider().withAdditionalDeserializers(deserializers));
MyModel value = mapper.treeToValue(node, MyModel.class);
MyIntegerDeserializer
和MyLongDeserializer
分别是Integer
和Long
值的自定义反序列化器。在我的情况下,这些是内部默认对应的反序列化器类的精确副本,附加代码可以优雅地处理NumberFormatException