我们有几个@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。