验证个别请求参数

我在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知道如何注入,比如HttpRequestModelMap等,将会获得数据绑定。 只需通过将请求参数名称与bean属性名称和调用设置器进行匹配,即可完成此操作。 @ModelAttribute只是个人风格的东西,在这种情况下它没有做任何事情。 通过WebDataBinder将JSR-303与方法参数上的@Valid集成在一起。 如果使用@RequestBody ,则使用基于内容类型的对象编组器@RequestBody通过spring确定用于请求主体(通常来自http头)。调度器servlet( AnnotationMethodHandlerAdapter真的)没有办法'翻转验证开关“用于任意编组。 它只是将Web请求内容传递给消息转换器并获取一个Object。 没有生成BindingResult对象,所以无论如何都无处设置错误。

您仍然可以将验证程序注入控制器并在获得的对象上运行验证程序,但它并没有在填充BindingResult的请求参数上与@Valid进行魔术集成。


这似乎是可能的(使用Spring 4.1.2),请参阅https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/

从上面的页面中提取:

  • 向Spring @Configuration类添加MethodValidationPostProcessor:

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
    
  • 将@Validated添加到控制器类

  • 在@RequestParam之前使用@Size

    @RequestMapping("/hi")
    public String sayHi(@Size(max = 10, message = "name should at most 10 characters long") @RequestParam("name") String name) {
        return "Hi " + name;
    

    }

  • 在@ExceptionHandler方法中处理ConstraintViolationException


  • 如果您有多个需要验证的请求参数(使用Http GETPOST )。 您也可以创建一个自定义模型类,并使用@ Valid和@ ModelAttribute来验证这些参数。 通过这种方式,您可以使用Hibernate Validator或javax.validator api来验证参数。 它是这样的:

    请求方法:

    @RequestMapping(value="/doSomething", method=RequestMethod.GET)
    public Model dosomething(@Valid @ModelAttribute ModelRequest modelRequest, BindingResult result, Model model) {
    
        if (result.hasErrors()) {
            throw new SomeException("invalid request params");
        }
    
        //to access the request params
        modelRequest.getFirstParam();
        modelRequest.getSecondParam();
    
        ...   
    }
    

    ModelRequest类

    class ModelRequest {
    
        @NotNull
        private String firstParam;
    
        @Size(min = 1, max = 10, message = "You messed up!")
        private String secondParam;
    
        //Setters and getters
    
        public void setFirstParam (String firstParam) {
            this.firstParam = firstParam;
        }
    
        public String getFirstParam() {
            return firstParam;
        }
    
        ...
    }
    

    希望有所帮助。

    链接地址: http://www.djcxy.com/p/48447.html

    上一篇: validate individual request params

    下一篇: Which Spring Framework provides REST Services?