1

我目前正在开发一个使用 Play Framework 2.1.0 的 Web 项目。Play 支持一个不错的 API 来解析表单数据并将其直接映射到模型 bean。看起来像,

Form<Employee> form = Form.form(Employee.class).bindFromRequest();
if (form.hasErrors()) {
    return badRequest(template.render(form));
}

该 API 还可以即时进行验证,并且能够处理绑定失败,比如无法将字符串转换为整数。Form API 将错误的集合映射到属性的名称。在 Form API 的基础上,Play 使用了 Spring 验证框架的 DataBinder,它实际上是在做所有的事情。

我想知道是否有类似的绑定 API 可以直接从 JSON 转换为 bean,并支持处理绑定失败?

Play 2.0 在内部使用 Jackson,当绑定失败时会失败并简单地抛出异常。我查看了代码,看起来并不容易抑制这些错误。

是否有一些框架可以开箱即用地满足我的要求?

本质上,我需要框架将 JSON 转换为 Java Bean,它可以优雅地处理绑定失败。

如果它允许我在某个地方收集它们,那就太好了,这样我就可以生成适当的验证错误。一旦 JSON 被解析为 Bean,我将使用 javax.validation API 对解析的对象运行自定义验证,以执行更具体的验证。

4

1 回答 1

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的自定义反序列化器。在我的情况下,这些是内部默认对应的反序列化器类的精确副本,带有额外的代码来优雅地处理IntegerLongNumberFormatException

于 2013-11-14T07:52:13.900 回答