2012-07-07 10 views
10

Tengo una pregunta conceptual muy ingenua aquí para aclararme. En mi aplicación actualmente estoy usando JSR 303 Hibernate validador para validar el modelo de dominio con @NotBlank y @NotNull anotaciones, como la comprobación de nombre de usuario, contraseña, etc.Uso del validador JSR-303 en lugar del Validador de primavera

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

Pero para la validación de la lógica de dominio como nombre de usuario existente, lo todavía estoy usando la interfaz de validación de primavera

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

} 

En el controlador estoy usando tanto

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

    } 

¿es posible sólo para usar Hibernate Validator y no una ¿Todos usan Spring Validator para validar la lógica del dominio?

Respuesta

15

sí, se puede utilizar la validación de JSR para su validación lógica de dominio. Debe definir anotaciones de restricciones personalizadas y definir la validación de la lógica de dominio dentro de ella.
Como
Definición de anotación personalizada restricción 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 {}; 
} 

validador Definición para la anotación personalizado.

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

El uso de la anotación personalizada

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

Gracias, eso es lo que estaba buscando :-) – tintin

+0

@tintin: Me alegro de poder ayudar :) – xyz

2

Si está configurando Spring MVC con <mvc:annotation-driven/>, entonces configurará automáticamente un JSR 303 validator si algún validador JSR 303 impl (hibernate-validator por ejemplo) está presente en el classpath.

O si lo desea expresamente para configurar el validador, se puede hacer esto:

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

De nuevo, esto sería buscar una aplicación JSR 303 y usar eso como el validador.

Puede defecto para validar cualquier forma @Valid objeto mediante el registro de un validador global de esta manera:

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

Creo OP pidiendo la manera de implementar la validación de la lógica de negocio en JSR como se define en la validación de la primavera. En mi humilde opinión se trata de definir anotaciones personalizadas en JSR-303, mientras que su respuesta se refiere a la configuración y el uso de la validación de JSR. Por favor corrígeme si estoy haciendo una suposición incorrecta. – xyz

Cuestiones relacionadas