2011-01-12 22 views
16

Mam backend Java z wiosny MVC i używam walidacji w ten sposób na mojego obiektu domeny dla adresu e-mail:Java/Wiosna MVC 3 walidacja adresu email

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; 

Ale ja się z te linie kodu

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()) 
} 

uzyskać to na konsoli:

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

ale nie mam jak adres e-mail [email protected], więc wyrażenie regularne nie pasuje.

Więc mam dwa prolems:

  • Co tu się stało?
  • Jak mogę zdefiniować komunikat o błędzie na własną rękę, ponieważ wyświetlacz to użytkownikowi, że nie jest to dobra rzecz :-)

Z góry dziękuję za pomoc i pozdrawiam.

+0

Która wersja Spring MVC używasz? –

+0

Najnowsza wersja 3.0.5. – Tim

Odpowiedz

36

Jeśli używasz Hibernate Validator możesz użyć @Email annotation W każdym razie możesz utworzyć niestandardową adnotację ograniczenia i ustawić niestandardową wiadomość do wyświetlenia w pliku właściwości zasobów.

+1

+1 Gorąco polecam korzystanie z gotowych adnotacji @Email. Nie ma sensu robić tego samemu. – GaryF

+1

Dodałem adnotację "@ Email", która wierzyła, że ​​będzie ona zarządzać wszystkimi automatycznie. Nie mam racji. Jaki jest sens korzystania z tej adnotacji, jeśli muszę mimo to dodawać "@ Pattern"? – vault

+0

Dodaj do swojej ścieżki klasowej plik hibernacji-validator.jar (jeśli używasz Mavena, sprawdź odpowiedź Bassem'a). Automatycznie przechwyci każde pole lub właściwość z adnotacją @Email. –

9

Najpierw spróbuj prostsze regex takich jak to:

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

niż można spróbować RFC 2822 wersja:

"(?:[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])+)\\])" 

Daj mi znać, gdy obaj pracowali dla ciebie.

wziąć również spojrzeć na ten pakiet

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

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

To może być lepszym rozwiązaniem.

+0

Drugi działa, ale pojawia się kolejny błąd ... Muszę spojrzeć, jaki jest problem 'javax.validation.ConstraintViolationException: sprawdzanie poprawności nie powiodło się dla klas [com.mydomain.myproject.domain.Person] podczas aktualizacji dla grup [javax.validation.groups.Default,] ' – Tim

+0

Ale brak odpowiedzi. Stworzyłem pytanie tutaj: http://stackoverflow.com/questions/4675204/javax-validation-constraintviolationexception-validation-failed-for-classes-duri, ponieważ nie wiem, dlaczego ten błąd występuje. Jeśli sprawdzę obiekt, brak błędów, ale po zatwierdzeniu obiektu do aktualizacji, wystąpi błąd. – Tim

+0

Zaktualizowałem to nowe pytanie. Nowy problem występuje tylko wtedy, gdy wstawię '@ Pattern' do mojego obiektu domeny Person. – Tim

2

Twój regex ma kilka instancji '+' w tym, co jest dziwne. adresy e-mail zwykle nie muszą zawierać pojedynczych cudzysłowów :) Myślę, że być może oznacza to łączenie fragmentów ciągu, a te powinny być podwójnymi cytatami?

Aby zdefiniować własną wiadomość, wystarczy dodać message="{someWay.of.definingCodes}" do adnotacji. Następnie określ tłumaczenie dla niego w ValidationMessages.properties w domyślnym pakiecie.

Alternatywnie narzędzie do sprawdzania stanu hibernacji zapewnia org.hibernate.validator.Email, jeśli chcesz polegać na rozszerzeniu dostawcy.

+0

Dodałem wiadomość i utworzyłem plik 'ValidationMessages.properties' w moim folderze WEB-INF/messages z treścią:' someWay.of.definingCodes = test'. Ale wynikiem jest '{someWay.of.definingCodes}' zamiast 'test' ... – Tim

+0

domyślny pakiet znajduje się na ogół w WEB-INF \ classes :) – Affe

+0

Oh, okay, w moim Eclipse IDE WEB-INF \ Katalog klas wydaje się pusty, ponieważ nie mogę go otworzyć. Czy powinienem utworzyć nowy plik o nazwie 'ValidationMessages.properties'? – Tim

6

Można użyć @Email od Hibernate Validator:

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.4.1.Final</version> 
    </dependency> 
Powiązane problemy