2012-07-07 11 views
10

Ho qui una domanda concettuale molto ingenua per chiarimenti. Nella mia app Attualmente sto usando JSR 303 Hibernate Validator per la validazione del modello di dominio con @NotBlank e @NotNull annotazioni, come il controllo nome utente, password eccUtilizzo del validatore JSR-303 invece di Spring Validator

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; 
    ... 

Ma per convalidare la logica del dominio, come nome utente esistente, I sto ancora utilizzando l'interfaccia

@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."); 
    } 

} 

Validator Spring Nel controllore che sto usando sia

@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(); 

    } 

e 'possibile solo per usare Hibernate Validator e non un tutti usano Spring Validator per validare la logica di dominio?

risposta

15

Sì, è possibile utilizzare la convalida JSR per la convalida logica di dominio. È necessario definire annotazioni di vincoli personalizzati e definire la convalida della logica di dominio al suo interno.
Come
Definizione annotazione vincolo personalizzato 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 {}; 
} 

Definizione validatore per l'annotazione personalizzata.

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; 
    }  
} 
} 

Utilizzando annotazione personalizzato

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

Grazie, questo è quello che stavo cercando :-) – tintin

+0

@tintin: Felice di poter aiutare :) – xyz

2

Se si sta configurando Spring MVC con <mvc:annotation-driven/> allora configurerà automaticamente un JSR 303 validator se alcuni JSR 303 impl validatore (hibernate-validatore per esempio) è presente nel classpath.

Oppure, se si vuole esplicitamente configurare il validatore, si può fare questo:

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

Anche questo apparirebbe per un'implementazione JSR 303 e utilizzarlo come il validatore.

È possibile default per validare qualsiasi oggetto form @Valid registrando un validatore globale in questo modo:

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

penso OP chiedendo come implementare la convalida logica di business in JSR come definiamo nella convalida primavera. IMHO riguarda la definizione dell'annotazione personalizzata in JSR-303 mentre la risposta parla della configurazione e dell'utilizzo della convalida JSR. Per favore correggimi se sto facendo un'ipotesi errata. – xyz

Problemi correlati