Walidacja fasoli wiosennej na podstawie adnotacji
Badam podejście oparte na adnotacjach do sprawdzania poprawności użycia Spring bean przy użyciumoduły sprężynowe. Wten samouczek, następujący komponent bean (pominięte gettery i settery) jest używany jako przykład:
public final class User {
@NotBlank
@Length(max = 80)
private String name;
@NotBlank
@Email
@Length(max = 80)
private String email;
@NotBlank
@Length(max = 4000)
private String text;
}
Komunikat o błędzie używany w przypadku nieprzestrzegania określonej reguły sprawdzania poprawności powinien być zgodny z tym formatem:
bean-class.bean-propery[validation-rule]=Validation Error message
Przykłady pokazanej powyżej klasy obejmują:
User.email[not.blank]=Please enter your e-mail address.
User.email[email]=Please enter a valid e-mail address.
User.email[length]=Please enter no more than {2} characters.
Fakt, że klucze wiadomości zawierają nazwę klasy, przedstawia kilka problemów:
Jeśli nazwa klasy zostanie zmieniona, klucze wiadomości również muszą zostać zmienioneJeśli mam inną klasę (np. Osobę) z własnością e-mail, która jest sprawdzana identycznie z User.email, muszę zduplikować wiadomości, np.
Person.email [not.blank] = Podaj swój adres e-mail.
Person.email [email] = Podaj poprawny adres e-mail.
Person.email [length] = Wpisz nie więcej niż {2} znaków.
W rzeczywistości dokumentacja twierdzi, że możliwe jest skonfigurowanie domyślnej wiadomości dla określonej reguły (np. @Email) w następujący sposób:
email=email address is invalid
Ten domyślny komunikat powinien być używany, jeśli nie można znaleźć komunikatu specyficznego dla komponentu dla reguły. Jednak z mojego doświadczenia wynika, że to po prostu nie działa.
Alternatywnym mechanizmem unikania duplikatów wiadomości jest przekazanie klucza komunikatu o błędzie do adnotacji reguły. Załóżmy na przykład, że zdefiniowałem następujący domyślny komunikat o błędzie dla reguły @Email
badEmail=Email address is invalid
Ten komunikat powinien zostać użyty, jeśli przypiszę odpowiednią właściwość w ten sposób:
@Email(errorCode="badEmail")
private String email;
Jednak spróbowałem tego, znowu i znowu, to po prostu nie działa. Czy ktoś znalazł sposób na uniknięcie duplikowania komunikatów o błędach podczas korzystania z tej struktury sprawdzania poprawności?