2008-09-29 11 views
14

Badam podejście oparte na adnotacjach do sprawdzania poprawności fasoli szparagowej za pomocą spring modules. W this tutorial następujące fasoli (pobierające i ustawiające pominięte) służy jako przykład:Adnotacja na podstawie sprawdzania fasoli sprężynowej

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, który jest używany, czy dana reguła sprawdzania poprawności jest nieposłuszny powinny następujący format:

bean-class.bean-propery[validation-rule]=Validation Error message 

Przykłady klasy przedstawionym powyżej 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ść zawierać nazwę klasy przedstawia kilka problemów:

  1. Jeśli klasa jest zmieniana, klawisze wiadomość również muszą być zmienione
  2. Jeśli mam innej klasy (np Person) z usługą e-mail sprawdzaną identycznie jak User.email, muszę zduplikować wiadomości, np.

    Person.email [not.blank] = Wprowadź swój adres e-mail.
    Person.email [email] = Wprowadź poprawny adres e-mail.
    Person.email [długość] = Wprowadź nie więcej niż {2} znaków.

W rzeczywistości, roszczenia dokumentację można skonfigurować domyślny komunikat dla danej reguły (np @Email) jak poniżej:

email=email address is invalid 

Ten domyślny komunikat powinien być używany, jeśli bean- nie można znaleźć określonej wiadomości dla reguły. Jednak moje doświadczenie jest takie, ż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. Na przykład załóżmy, że mam zdefiniowane następujący komunikat o błędzie domyślny dla reguły @Email

badEmail=Email address is invalid 

Komunikat ten powinien być używany, jeśli opisywanie odpowiednią usługę tak:

@Email(errorCode="badEmail") 
private String email; 

Jednak to próbowałem, i po raz kolejny, po prostu nie działa. Czy ktoś znalazł sposób uniknięcia powielania komunikatów o błędach podczas korzystania z tej struktury sprawdzania poprawności?

Odpowiedz

6

Rzuciłem okiem na BeanValidator API i wygląda na to, że warto wypróbować właściwość errorCodeConverter.

Musisz wdrożyć własną wersję ErrorCodeConverter lub skorzystać z jednej z dostarczonych implementacji?

.... 
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator" 
    p:configurationLoader-ref="configurationLoader" 
    p:errorCodeConverter-ref="errorCodeConverter" /> 

<bean id="errorCodeConverter" class="contact.MyErrorCodeConverter" /> 
.... 

Uwaga: configurationLoader jest kolejnym fasoli zdefiniowane w XML config używanych w samouczku

Przykład konwerter:

package contact; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.springmodules.validation.bean.converter.ErrorCodeConverter; 

public class MyErrorCodeConverter implements ErrorCodeConverter { 

    private Log log = LogFactory.getLog(MyErrorCodeConverter.class); 

    @Override 
    public String convertPropertyErrorCode(String errorCode, Class clazz, String property) { 
     log.error(String.format("Property %s %s %s", errorCode, clazz.getClass().getName(), property)); 
     return errorCode; // <------ use the errorCode only 
    } 

    @Override 
    public String convertGlobalErrorCode(String errorCode, Class clazz) { 
     log.error(String.format("Global %s %s", errorCode, clazz.getClass().getName())); 
     return errorCode; 
    } 
} 

Teraz właściwości powinno działać:

MyEmailErrorCode=Bad email 

class Foo { 
    @Email(errorCode="MyEmailErrorCode") 
    String email 
} 
+0

W konfiguracji Wiosna pokazanej powyżej, co to jest bean ConfigurationLoader? –

+0

Witam Don - pobrałem kod źródłowy z wspomnianej strony samouczka, a configurationLoader jest już jednym z komponentów zdefiniowanych w ich pliku konfiguracyjnym xml. Kiedy wrócę do domu i spojrzę na kod, który napisałem, mogę zaktualizować to ogłoszenie. – toolkit

+0

Element bean konfiguracjiLoader z samouczka jest typu org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader – toolkit

2

Sprawdzanie wiosenne ma ErrorCod eConverter że robi to:

org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter

Gdy ta jest używana, pakiet zasobów będą sprawdzane pod kątem następujących kodów:

[errorCode.commandBeanName.fieldName , errorCode.fieldName, errorCode.fieldClassName, kod błędu]

  • kod błędu to aktualny kod błędu sprawdzania poprawności np. not.blank, email.
  • KomendaBeanName jest taka sama, jak nazwa klucza modelu, która odwołuje się do komponentu bean komponentu formularza .
  • fieldName to nazwa pola.
  • fieldClassName jest nazwą klasy pola np. java.lang.String, java.lang.Integer

Tak na przykład, jeśli mam fasoli, który jest wymieniony w modelu za pomocą klawisza „formBean” i EMAILADDRESS pola typu java.lang.String nie zawierają adres e-mail, który powoduje wiadomość e-mail o błędzie. Ramy walidacji będą próbowali rozwiązać następujące kody wiadomość:

[email.formBean.emailAddress, email.emailAddress, email.java.lang.String, email]

Jeśli errorCode otrzymuje errorCode " badEmail”tak:

@Email (errorCode = "badEmail")

kody wiadomości, że ramy będą próbowali rozwiązać będą:

[badEmail.formBean.emailAddress, badEmail.emailAddress, badEmail .Jawa. lang.String, badEmail]

Sugerowałabym zachowanie tego samego kodu errodCode. Zatem jeden komunikat może być użyty dla wszystkich pól, które mają przypisany ten kod błędu. Jeśli potrzebujesz więcej informacji na temat konkretnego pola, możesz dodać wiadomość do paczek zasobów za pomocą kodu errorCode.commandBeanName.field.

0

Dodaj następujące ziarna w pliku applicationContext.xml.

<bean id="configurationLoader" 
    class="org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader" /> 

<!-- Use the error codes as is. Don't convert them to <Bean class name>.<bean field being validated>[errorCode]. -->  
<bean id="errorCodeConverter" 
    class="org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter"/> 

<!-- shortCircuitFieldValidation = true ==> If the first rule fails on a field, no need to check 
    other rules for that field --> 
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator" 
    p:configurationLoader-ref="configurationLoader" 
    p:shortCircuitFieldValidation="true" 
    p:errorCodeConverter-ref="errorCodeConverter"/> 
Powiązane problemy