Spring 3.0 MVC自定义WebArgumentResolver跳过验证

时间:2012-11-06 07:17:29

标签: java spring validation spring-mvc

我们有几个@RequestMapping带注释的控制器方法。它们每个都有超过1个我们想要受约束的参数。例如:

@RequestMapping(value = "/a/b", method = RequestMethod.GET)
@ResponseBody
public Response getAB(ARequest aRequest, BRequest bRequest) throws ServiceException {
    ...
}

这显然很好。但是,我们要求的一个怪癖是我们获得包含下划线的请求参数。例如;在上面的端点上,我们会收到一个类似于http://x:8000/a/b?req_param=1的请求。这会导致默认的Spring绑定失败,因为在我们的对象中,我们希望绑定我们定义req_param驼峰(reqParam),而不是在我们的Java代码中使用下划线。

为了解决这个问题,我们已经实现了我们自己的注释(@Camelize)和我们自己的自定义WebArgumentResolver,我们已经在Spring上下文中注册了它们。然后,我们使用@Camelize注释我们的控制器方法参数,这会导致我们的自定义WebArgumentResolver介入并更正绑定。这也很好。

现在出现问题,更具体地说,当我们想要验证我们的参数时,它会失败。例如,继续上面的示例:

@RequestMapping(value = "/a/b", method = RequestMethod.GET)
@ResponseBody
public Response getAB(@Camelize @Valid ARequest aRequest, Errors aRequestErrors, BRequest bRequest) throws ServiceException {
    ...
}

此操作失败,例外情况为java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

我们似乎无法使用自定义WebArgumentResolver并同时使用@Valid进行验证。我们已将其缩小到自定义WebArgumentResolver,就 返回UNRESOLVED时,Spring MVC将只是不用担心验证并抛出上面的例外。

  • 任何人都可以确认这是预期的行为吗?
  • 有解决办法吗?目前我们正在考虑删除自定义WebArgumentResolver并将其替换为过滤器,但这似乎对我们需要的内容非常具有侵扰性。

谢谢!

编辑:我们正在使用Spring 3.0.5。

0 个答案:

没有答案