2014-07-24 80 views
1

我已經爲我的項目啓用了spring mvc annotation。我們的想法是使用@Valid註解與Spring註解,以避免類似的控制線: validator.validate(form, errors)@Valid with spring annotations

我發現這個東西不帶彈簧的註解從包裝工作:

org.springmodules.validation.bean.conf.loader.annotation.handle 

經過調查我發現我可以使用javaxorg.hibernate.validator.constraints的註釋作爲替代方法。

但不幸的是,我有一些特殊的情況下,當我無法做到這一點:

@MinSize(applyIf = "name NOT EQUALS 'default'", value = 1) 

會好知道以何種方式春天註釋可以與@Valid或任何其他替代方式來使用,以避免重構相關applyIf屬性(將條件移至java代碼)。

回答

0

像這樣的東西可能會幫助你

public class UserValidator implements Validator { 

    @Override 
    public boolean supports(Class clazz) { 
     return User.class.equals(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 
     User user = (User) target; 

     if(user.getName() == null) { 
      errors.rejectValue("name", "your_error_code"); 
     } 

     // do "complex" validation here 

    } 

} 

然後在您的控制器,你會:

@RequestMapping(value="/user", method=RequestMethod.POST) 
    public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){ 
     UserValidator userValidator = new UserValidator(); 
     userValidator.validate(user, result); 

     if (result.hasErrors()){ 
      // do something 
     } 
     else { 
      // do something else 
     } 
} 

如果有驗證錯誤,result.hasErrors()將是真實的。

注意:您還可以使用「binder.setValidator(...)」在控制器的@InitBinder方法中設置驗證程序。或者你可以在控制器的默認構造函數中實例化它。或者在控制器中注入(@Autowired):非常有用,因爲大多數驗證器都是單例+單元測試模擬變得更容易+驗證器可以調用其他Spring組件。

1

以下是如何創建自定義驗證器的示例。

起初創建自己的註解:

@Target({ ElementType.METHOD, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = StringValidator.class) 
public @interface ValidString { 

    String message() default "Invalid data"; 
    int min() default -1; 
    int max() default -1; 
    String regex() default ""; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 
} 

然後你需要一個自定義的驗證:

public class StringValidator implements ConstraintValidator<ValidString, String> { 

    private int    _min; 
    private int    _max; 
    private String   _regex; 
    private boolean   _decode; 

    public void initialize(ValidString constraintAnnotation) { 
     _min = constraintAnnotation.min(); 
     _max = constraintAnnotation.max(); 
     _regex = constraintAnnotation.regex(); 
     _decode = constraintAnnotation.decode(); 
    } 

    public boolean isValid(String value, ConstraintValidatorContext context) { 

     if (value == null) { 
      return false; 
     } 

     String test = value.trim(); 

     if (_min >= 0) { 
      if (test.length() < _min) { 
       return false; 
      } 
     } 

     if (_max > 0) { 
      if (test.length() > _max) { 
       return false; 
      } 
     } 

     if (_regex != null && !_regex.isEmpty()) { 
      if (!test.matches(_regex)) { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

最後,你可以在你的bean使用它和控制器:

public class UserForm { 

    @ValidString(min=4, max=20, regex="^[a-z0-9]+") 
    private String name; 

    //... 
} 

// Method from Controller 
@RequestMapping(method = RequestMethod.POST) 
public String saveUser(@Valid UserForm form, BindingResult brResult) { 

    if (brResult.hasErrors()) { 
     //TODO: 
    } 

    return "somepage"; 
} 
相關問題