Java Spring 3.0 MVC自定义WebArgumentResolver跳过验证
我们有两个Java Spring 3.0 MVC自定义WebArgumentResolver跳过验证,java,spring,validation,spring-mvc,Java,Spring,Validation,Spring Mvc,我们有两个@RequestMapping带注释的控制器方法来做这些事情。他们每个人都有一个以上的论点,我们希望受到约束。例如: @RequestMapping(value = "/a/b", method = RequestMethod.GET) @ResponseBody public Response getAB(ARequest aRequest, BRequest bRequest) throws ServiceException { ... } 这显然效果不错。然而,我们需求
@RequestMapping
带注释的控制器方法来做这些事情。他们每个人都有一个以上的论点,我们希望受到约束。例如:
@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
camel-cased(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参数声明时没有前面的模型属性。检查您的处理程序方法签名代码>
我们似乎无法同时使用自定义的WebArgumentResolver
和使用@Valid
进行验证。我们已经将其缩小到定制的WebArgumentResolver
,从这个意义上讲,只要它不返回未解析的,Spring MVC就不会麻烦验证并抛出上面的异常
- 有人能证实这是预期的行为吗
- 这有什么办法吗?目前,我们正在考虑删除自定义的
WebArgumentResolver
,并将其替换为一个过滤器,但对于我们所需要的内容来说,这似乎非常麻烦
谢谢
编辑:我们使用的是Spring 3.0.5。我想在这种情况下,您不能使用错误作为参数。看看是否helps@vinay好链接。这个问题似乎确实与BindingResult
参数有关。评论中也有一个有趣的“变通方法”。值得一试。