【问题标题】:spring validation how do I get validation results?春季验证如何获得验证结果?
【发布时间】:2012-06-26 17:54:21
【问题描述】:

代码如下:

....
@RequestMapping( "/test")
    @ResponseBody
    public ResponseTO test(
            @Valid  @RequestBody RequestTO to, HttpServletResponse resp)
    {
           //how do I get validation results here?
        return new ResponseTO("111");
    }

  @InitBinder
  protected void initBinder(WebDataBinder binder) {
      binder.setValidator(new TestValidator());
  }




class TestValidator implements Validator {

    /**
    * This Validator validates just Person instances
    */
    public boolean supports(Class clazz) {
        return RequestTO.class.equals(clazz);
    }

    public void validate(Object obj, Errors e) {
        ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
        RequestTO tx = (RequestTO) obj;
        if (tx.getName().equals("buy")) {
            e.rejectValue("feature", "NOT BUY");
        } 
    }
}   

我想不通的部分是如何在控制器中获得验证结果?谢谢!

【问题讨论】:

  • 您可能正在混合使用 Spring 验证和 JSR 验证(@Valid)。见answer

标签: spring validation


【解决方案1】:

正如 Sunil 所说,您正在混合两种方法

如果要使用 JSR303 Bean 验证,可以定义 bean 字段的约束,如

public class Customer {

    @NotEmpty //make sure name is not empty
    String name;

    @Range(min = 1, max = 150) //age need between 1 and 150
    int age;
 } 

@valid 用于验证 bean 字段,您可以使用 BindingResult 之类的方式获取错误

@RequestMapping(value = "/signup", method = RequestMethod.POST)
    public String addCustomer(@Valid Customer customer, BindingResult result) {

        if (result.hasErrors()) {
            return "SignUpForm";
        } else {
            return "Done";
        }
    }  

查看link 了解更多详情。

或者您可以实现Validator 并定义validate 方法(正如您在问题中提到的那样)。
然后你必须调用validate 方法,传递BindingResult 对象并添加错误(如果存在)。然后您可以检查BindingResult 对象是否有任何错误。
例如。

new TestValidator ().validate(requestTO , bindingResult); // invoking validate method     

并检查错误

if (bindingResult.hasErrors()) {
  // Errors are present do something here
}
else
{
  // All is well!!
}

或者您可以将validator 定义为特定的bean spring 配置文件。详情请查看link

【讨论】:

  • 谢谢!还有一个问题:调用 validate 方法的首选方法是什么?是否可以使用@InitBinder 来做到这一点?
  • 我认为通过 XML 进行配置是个好方法(因为它使配置与业务逻辑分离)。 @InitBinder 似乎不是一个好的选择。
  • 你能给我举个例子吗?我在那个项目中没有网页,它都是宁静的网络服务。谢谢
  • @Bobo:我在答案中添加了一些链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多