2012-07-07 46 views
10

我有一個非常天真的概念性問題來澄清。在我的應用我目前使用JSR 303 Hibernate驗證確認與@NotBlank和@NotNull註解域模型,如檢查用戶名,密碼等使用JSR-303驗證器而不是Spring驗證器

public class Admin { 

    private Long id; 
    @NotBlank(message = "Username should not be null") 
    private String username; 
    @NotBlank(message = "Username should not be null") 
    private String password; 
    ... 

但對於驗證域邏輯類似現有的用戶名,我「M仍然使用Spring的Validator接口

@Component 
public class AdminValidator implements Validator { 
    ... 
    @Override 
    public void validate(Object target, Errors errors) { 
    Admin admin = (Admin) target; 
    if (usernameAlradyExist())){ 
     errors.rejectValue("username", null, "This user already exist's in the system."); 
    } 

} 

在控制器中,我同時使用

@RequestMapping(value = "/register", method = RequestMethod.POST) 
public String register(@Valid @ModelAttribute("admin") Admin admin, BindingResult bindingResult,) { 
    validator.validate(admin, bindingResult); 
    if (bindingResult.hasErrors()) { 
     return REGISTER_ADMIN.getViewName(); 

    } 

是否可以只使用Hibernate的驗證,而不是都使用Spring驗證器驗證域邏輯?

回答

15

是的,你可以使用JSR驗證您的域邏輯驗證。您需要定義自定義約束註釋並在其中定義您的域邏輯驗證。

定義定製約束註釋了對定製標註UserExistsConstraint

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy=UserExistsConstraintValidator.class) 

public @interface UserExistsConstraint { 
String message() default "This user already exist's in the system."; 
Class<!--?-->[] groups() default {}; 
Class<!--? extends Payload-->[] payload() default {}; 
} 

定義驗證。

public class UserExistsConstraintValidator implements ConstraintValidator<UserExistsConstraint, object=""> { 

@Override 
public void initialize(UserExistsConstraint constraint) { 

} 

@Override 
public boolean isValid(Object target, ConstraintValidatorContext context) { 
    if (usernameAlradyExist()) 
    {  
    return false; 
    } 
    else 
    { 
    return true; 
    }  
} 
} 

使用自定義的註釋

public class Admin { 

    private Long id; 
    @NotBlank(message = "Username should not be null") 
    @UserExistsConstraint 
    private String username; 
    @NotBlank(message = "Username should not be null") 
    private String password; 
    ... 
+0

謝謝,那就是我一直在尋找的:-) – tintin 2012-07-08 10:28:56

+0

@tintin:很高興我能幫忙:) – xyz 2012-07-08 10:32:32

2

如果您正在配置Spring MVC <mvc:annotation-driven/>,那麼它將自動配置一個JSR 303 validator,如果某些JSR 303驗證程序impl(例如,hibernate驗證程序)存在於類路徑中。

或者,如果你明確要配置的驗證器,你可以這樣做:

<bean id="validator" 
     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

這再次將尋找一個JSR 303的實現和使用,作爲驗證。

可以默認情況下,通過註冊全球驗證這種方法來驗證任何形式@Valid對象:

<mvc:annotation-driven validator="validator"/> 
+1

我覺得OP詢問如何實現在JSR業務邏輯驗證就像我們在春天驗證定義。恕我直言,其關於在JSR-303中定義自定義註釋,而你的答案談論配置和使用JSR驗證。如果我做出錯誤的假設,請糾正我。 – xyz 2012-07-08 09:44:48

相關問題