2011-04-07 84 views

回答

1

不是100%肯定,我正確地按照你的問題,但與Spring MVC的,你傳遞對象到方法和註釋它(至少在春季3),像這樣:

@RequestMethod(value = "/accounts/new", method = RequestMethod.POST) 
public String postAccount(@ModelAttribute @Valid Account account, BindingResult result) { 
    if (result.hasErrors()) { 
     return "accounts/accountForm"; 
    } 

    accountDao.save(account); 
} 

的這裏的相關注釋是@Valid,它是JSR-303的一部分。包含BindingResult參數也是如此,因此您可以檢查錯誤,如上所述。

4

使用簡單的驗證器(您的自定義驗證器) 您不需要請求對象在驗證器中獲取參數。你可以直接從它。

例如:這將檢查字段從要求符合名稱nameage

public class PersonValidator implements Validator { 

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

    public void validate(Object obj, Errors e) { 
     ValidationUtils.rejectIfEmpty(e, "name", "name.empty"); 
     Person p = (Person) obj; 
     if (p.getAge() < 0) { 
      e.rejectValue("age", "negativevalue"); 
     } else if (p.getAge() > 110) { 
      e.rejectValue("age", "too.darn.old"); 
     } 
    } 
} 

請參見

9

你有兩個選擇:

  • JSR 303(Bean驗證)驗證
  • 春校驗

對於JSR 303你需要春季3.0和必須註解與JSR 303個註解模型類,寫一個@在Web控制器處理程序方法中,在您之前有效參數。 (如Willie Wheeler show in his answer)。 Additionaly你必須在配置啓用此功能:

<!-- JSR-303 support will be detected on classpath and enabled automatically --> 
<mvc:annotation-driven/> 

對於春校驗,你需要編寫驗證(見Jigar Joshi's answer)實現了org.springframework.validation.Validator接口。您必須在控制器中註冊您的驗證器。在Spring 3.0,你可以在註解的方法,一個@InitBinder做到這一點通過WebDataBinder.setValidatorsetValidator它是超類DataBinder的方法)

Example (from the spring docu) 
@Controller 
public class MyController { 

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

    @RequestMapping("/foo", method=RequestMethod.POST) 
    public void processFoo(@Valid Foo foo) { ... } 
} 

有關詳細信息,看看Spring參考,章5.7.4 Spring MVC 3 Validation

順便說一句:在Spring 2中,SimpleFormController中有一些像setValidator屬性。

+0

設置彈簧驗證隱藏冬眠驗證功能(JSR 303)。是否有任何方法來保持hibernate驗證,並且使用自己的spring驗證器? – Saram 2013-01-09 12:38:01

+0

@Saram:我強烈建議使用JSR 303而不是spring驗證器。 - 無論如何,如果你想問一些問題,請發表一個新問題。 – Ralph 2013-01-09 12:59:18

+0

您可以使用'binder.addValidator(new FooValidator());'結合兩種驗證方法。 – shadowhorst 2016-06-30 20:00:23

0

您可以輕鬆地添加另一個方法與HttpServletRequest參數。

public void validateReq(Object target, Errors errors,HttpServletRequest request) { 

     // do your validation here 
} 

注意,你是不是覆蓋方法在這裏

0

我也有同樣的問題,當我使用的彈簧Validator是否驗證碼。 在驗證實現器中,我想從HttpSession(從HttpServletRequest獲取HttpSession)獲取正確的驗證碼。

沒有找到任何好的代碼讓它在驗證器中,太糟糕了!

有一些折中的方案如下:

  1. 在裝訂形式DTO添加其他字段(撥打:correctCaptcha),在控制器方法設置從HttpSession中字段的值,那麼你可以驗證在驗證器

    public class UserRegisterDto { 
        private String correctCaptcha; 
        //getter,setter 
    } 
    
  2. 添加在結合形式DTO HttpServletRequest的基準,然後可以在驗證器使用它。

    public class UserRegisterDto { 
        private HttpServletRequest request; 
        //getter ,setter 
    } 
    
    @RequestMapping(value = "register.hb", method = RequestMethod.POST) 
    public String submitRegister(@ModelAttribute("formDto") @Valid UserRegisterDto formDto, HttpServletRequest request,BindingResult result) { 
        formDto.setRequest(request); 
        if (result.hasErrors()) { 
         return "user_register"; 
        } 
    } 
    
+0

對不起,這是行不通的,也許使用Spring MVC攔截器是一個很好的解決方案 – monkeyk 2015-04-28 02:05:52