Spring DataBinder相当于Json

时间:2013-07-23 08:35:03

标签: java spring-mvc jackson playframework-2.1

我目前正在开发一个使用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后执行更具体的验证。

1 个答案:

答案 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);

MyIntegerDeserializerMyLongDeserializer分别是IntegerLong值的自定义反序列化器。在我的情况下,这些是内部默认对应的反序列化器类的精确副本,附加代码可以优雅地处理NumberFormatException