2011-01-12 18 views
16

tengo un motor Java con Spring MVC y estoy usando la validación de esta manera en mi objeto de dominio de una dirección de correo electrónico:Java/Spring MVC 3 validación de una dirección de correo electrónico

import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Pattern; 
import javax.validation.constraints.Size; 
... 
@NotNull 
@Size(min = 1, max = 100) 
@Pattern(regexp="^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]{2,4})$") 
private String email; 

Pero todo lo que consigo con estas líneas de código

Set<ConstraintViolation<Person>> failures = validator.validate(personObject); 
... 
Map<String, String> failureMessages = new HashMap<String, String>(); 
for (ConstraintViolation<Person> failure : failures) { 
    failureMessages.put(failure.getPropertyPath().toString(), failure.getMessage()); 
    System.out.println(failure.getPropertyPath().toString()+" - "+failure.getMessage()) 
} 

que conseguir esto en la consola:

email - must match "^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]{2,4})$" 

pero tengo como dirección de correo electrónico [email protected], por lo que la expresión regular no coincide.

Así que tienen dos prolems:

  • lo que está mal aquí?
  • Y cómo puedo definir un mensaje de error por mi cuenta, porque esta pantalla para el usuario, que no es una buena cosa :-)

Gracias de antemano por su ayuda y un saludo.

+0

¿Qué versión de Spring MVC se utiliza? –

+0

La última versión 3.0.5. – Tim

Respuesta

36

Si usa Hibernate Validator puede usar @Email annotation. De todos modos puede crear su anotación de contraint personalizada y establecer un mensaje personalizado para mostrar en su archivo de propiedades de recursos.

+1

+1 Recomiendo usar una anotación @Email preconstruida. No tiene sentido hacer esto por su cuenta. – GaryF

+1

Agregué la anotación '@ Email' creyendo que se administraría todo automáticamente. Me equivoco. ¿Cuál es el sentido de usar esta anotación si tengo que agregar de todos modos un '@ Pattern'? – vault

+0

Agregue a su ruta de clase el hibernate-validator.jar (si usa Maven verifique la respuesta de Bassem). Automáticamente interceptará cualquier campo o propiedad anotada con la anotación @Email. –

9

primer lugar, pruebe expresión regular simple como esto:

"\\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}\\b" 

de lo que puede probar la versión RFC 2822:

"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])" 

Avísame si el bien trabajado para usted.

también toman vistazo a este paquete

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

aquí
http://www.springbyexample.org/examples/spring-modules-validation-module.html

Podría ser una alternativa mejor.

+0

El segundo funciona, pero me sale otro error ... Tengo que mirar cuál es el problema 'javax.validation.ConstraintViolationException: la validación falló para las clases [com.mydomain.myproject.domain.Person] durante el tiempo de actualización para los grupos [javax.validation.groups.Default,] ' – Tim

+0

Pero no hubo respuesta. Creé una pregunta aquí: http://stackoverflow.com/questions/4675204/javax-validation-constraintviolationexception-validation-failed-for-classes-duri porque no sé por qué ocurre este error. Si compruebo el objeto, no hay fallas, pero al confirmar el objeto para actualizar, se produce el error. – Tim

+0

Lo actualicé con la nueva pregunta. El nuevo problema solo ocurre si coloco el '@ Pattern' en mi objeto de dominio Person. – Tim

2

Su expresión regular tiene un par de instancias de '+' en ella, lo cual es un poco extraño. generalmente no se requiere que las direcciones de correo electrónico tengan comillas simples :) Creo que quizás se trate de concatenar fragmentos de la Cadena, y esas deberían ser comillas dobles.

Para definir su propio mensaje, solo agregue message="{someWay.of.definingCodes}" a la anotación. Luego defina una traducción para él en ValidationMessages.properties en el paquete predeterminado.

El validador de hibernación alternativamente proporciona org.hibernate.validator.Email si está dispuesto a depender de una extensión de proveedor.

+0

Agregué el mensaje y creé un archivo 'ValidationMessages.properties' en mi carpeta WEB-INF/messages con el contenido:' someWay.of.definingCodes = test'. Pero el resultado es '{someWay.of.definingCodes}' en lugar de 'test' ... – Tim

+0

el paquete predeterminado generalmente se encuentra en WEB-INF \ classes :) – Affe

+0

Oh, está bien, en mi Eclipse IDE el WEB-INF \ El directorio de clases parece estar vacío, porque no puedo abrirlo. ¿Debo crear un nuevo archivo llamado 'ValidationMessages.properties' en él? – Tim

6

Puede utilizar @Email de Hibernate Validator:

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.4.1.Final</version> 
    </dependency> 
Cuestiones relacionadas