2011-06-10 17 views
8

Duplicar posibles:
using Hibernate Validator without calling annotation.programático Bean Validation (JSR 303) sin anotación

tengo esta anotación restricción compuesta (sólo para ilustración):

@Target... @Retention... 
@Constraint(validatedBy = {}) 
@Pattern(regexp = PasswordComplexity.AT_LEAST_TWO_NONE_ALPAH_CHARS) 
@Length(min = 6, max = 20) 
public @interface PasswordComplexity { 
    ...  
} 

Y Lo uso en Spring Controllers y Entity Classes.

Pero ahora necesito comprobar una sola Cadena en un método de Servicio, donde debo aplicar la misma restricción a una sola Cadena. Debido al hecho de que la restricción es la misma, quiero usar la misma definición de la restricción (@PasswordComplexity) (única fuente de verdad). Algo así como:

public void createUser(UserDto userDto, String password) { 
    if(hasViolation(validator.validate(password,PasswordComplexity.class))) { 
    throw new PasswordComplexityViolationException(); 
    } else { 
    … 
    } 
} 

Pero no sé cómo ejecutar el JSR 303 Validador de un objeto simple no anotado (String). ¿Es al menos posible, y cómo?

(yo uso de Hibernate Validator como JSR 303 proveedor)

+0

Entiendo por 'fuente única de verdad' que ha querido no tener que repetir su anotación que probablemente se coloca sobre la propiedad/campo 'contraseña' en su clase 'UserDto', ¿verdad? Pero en su ejemplo de "algo así como" al menos repite el nombre de la anotación ('PasswordComplexity'). ¿No es una redundancia también? –

+0

@Grzegorz Oledzki: no el problema es no escribir usar la anotación en diferentes lugares. Con 'fuente única de verdad' quiero decir que quiero usar la anotación en lugar de escribir la misma definición de cosas (longitud y patrón) en otro lugar. – Ralph

+0

@abalogh: La pregunta es un duplicado (lo he overlocked), pero la respuesta aceptada no coincidía con la pregunta, o al menos no con mi pregunta. – Ralph

Respuesta

2

Una forma de hacer esto sería escribir un validador personalizado completo, y empujar la lógica hacia abajo en esa clase que tiene la anotación sólo tiene que utilizar el validador. Esto significa que tiene una unidad de compilación independiente (Una clase completa PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ...) que puede usar independientemente de la anotación. Este enfoque también le facilitaría la prueba unitaria de la validación.

Sin embargo, dado que está utilizando la anotación como una forma de configurar el validador de expresiones regulares existente provisto por Hibernate, puede usar ese en su lugar, pasándole el patrón constante de la clase de anotación. También debería poder empaquetar su restricción de longitud en la expresión regular también, lo que sería más simple y más rápido que tener ambas anotaciones de todos modos.

Cuestiones relacionadas