Spring Web MVC-验证单个请求参数
我在Spring Web MVC 3.0中运行一个webapp,我有许多控制器方法,其签名大致如下:
@RequestMapping(value = "/{level1}/{level2}/foo", method = RequestMethod.POST)public ModelAndView createFoo(@PathVariable long level1,
@PathVariable long level2,
@RequestParam("foo_name") String fooname,
@RequestParam(value = "description", required = false) String description);
我想添加一些验证-例如,description
应限制为一定长度或fooname
仅包含某些字符。如果验证失败,我想向用户返回一条消息,而不是抛出一些未经检查的异常(如果我让数据渗透到DAO层,无论如何都会发生这种情况)。我知道JSR303,但尚未使用它,也不太了解如何在Spring上下文中应用它。
据我了解,另一种选择是将绑定@RequestBody
到整个域对象并在其中添加验证约束,但目前我的代码已设置为接受单个参数,如上所示。
使用这种方法将验证应用于输入参数的最直接方法是什么?
回答:
在当前发行版中,如果要进行自动验证,你仍将需要使用WebDataBinder将参数绑定到对象上。如果你使用的是SpringMVC,则值得学习,即使这不是你执行此任务的首选。
看起来像这样:
public ModelAndView createFoo(@PathVariable long level1, @PathVariable long level2,
@Valid @ModelAttribute() FooWrapper fooWrapper,
BindingResult errors) {
if (errors.hasErrors() {
//handle errors, can just return if using Spring form:error tags.
}
}
public static class FooWrapper {
@NotNull
@Size(max=32)
private String fooName;
private String description;
//getset
}
如果你在类路径上具有Hibernate Validator 4或更高版本,并使用默认的分派器设置,则它应该“正常工作”。
由于评论变得越来越大,因此进行编辑:
这是在这不是“预期”的人Spring知道如何注入,如一个你的方法签名的任何对象HttpRequest
,ModelMap等等,将得到的数据绑定。对于简单的情况,只需将请求参数名称与bean属性名称进行匹配并调用setter即可实现。这@ModelAttribute只是个人风格的事情,在这种情况下,它什么也没做。JSR-303与方法参数上的@Valid
集成通过插入WebDataBinder
。如果使用@RequestBody
,则使用的是基于spring确定请求正文的内容类型的对象编组器(通常仅来自http头。)分派器servlet(AnnotationMethodHandlerAdapter
确实)没有办法为任意封送编组“翻转验证开关”。它只是将Web请求的内容传递到消息转换器,并返回一个Object。不会生成BindingResult对象,因此无论如何都无法设置错误。
你仍然可以只将验证器注入控制器中,然后在获取的对象上运行它,它只是与@Validon
参数中的on请求参数没有魔术集成BindingResult
。
以上是 Spring Web MVC-验证单个请求参数 的全部内容, 来源链接: utcz.com/qa/421933.html