2009-12-10 18 views
19

Spring MVC çerçevesi altında validators yazmayı deniyorum, ancak belgelerde göze çarpan bir ihmal var. Errors nesnesine bir hata iletilirken, yöntemlerin çoğu errorCode adlı bir String parametresi bekler. Bu hata kodları, doğru anladığımda belirli hata iletilerinde destek görevi görür. Ama ben bu kodların haritalandığı yerde yaşamı anlayamıyorum.Bahar MVC doğrulama hata kodları nerede çözümlendi?

Spring MVC'nin Javadoc'undan bahsettiğim şeyin bir örneği burada;

public class UserLoginValidator implements Validator { 

    private static final int MINIMUM_PASSWORD_LENGTH = 6; 

    public boolean supports(Class clazz) { 
     return UserLogin.class.isAssignableFrom(clazz); 
    } 

    public void validate(Object target, Errors errors) { 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required"); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required"); 
     UserLogin login = (UserLogin) target; 
     if (login.getPassword() != null 
      && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) { 
      errors.rejectValue("password", "field.min.length", 
       new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)}, 
       "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length."); 
     } 
    } 
} 

Beni aydınlatabilecek biri var mı?

cevap

15

Varsayılan ileti çözücüyü kullanıyorum. Benim dispatcher-servlet.xml yılında

, ben

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages" /> 
</bean> 

ve sahip sonra böyle eşlemelerini içeren "messages.properties" adlı bir metin dosyası var benim sınıfları dizinin en üst düzeyde:

error.firstname.null=Please enter your first name. 
error.lastname.null=Please enter your last name. 

Özel bir MessageCodesResolver kullanmak isterseniz, MessageCodeResolver arabirimini uygulayabilir ve ardından çözümleyicinizi aşağıdaki gibi belirli bir denetleyici için tanımlayabilirsiniz:

<bean id="myController"> 
    <property name="messageCodesResolver" ref="myMessageCodesResolver" /> 
</bean> 

Dünya çapında bir özel MessageCodeResolver tanımlamanın bir yolu yoktur; enhancement request for that here var. Tüm kontrolör çekirdeklerini bir kontrolör fasülyesi tanımından elde etmek için fasulye mirasını kullanan bir yaklaşım, here tarif edilmektedir.

//result is BindingResult 
    List<String> errors = new ArrayList<String>(); 
    List<ObjectError> allErrors = result.getAllErrors(); 
    for (ObjectError error : allErrors) { 
     String message = messageSource.getMessage(error, null); 
     errors.add(message); 
    } 
+0

Bilgileriniz için teşekkürler, bu benim doğrulayıcıyı kullanmamı sağlıyor. Ama öğrenmeye ilgi duyduğumda, özel bir MessageCodeResolver'da yeniden yazmak istesem ne yapardım, nereye giderdim? Ayrıca sadece refah için ResourceBundleMessageSource'un javadoc'u http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.html adresinde bulunmaktadır. –

+1

Özel bir MessageCodeResolver kullanmak isterseniz, belirli bir denetleyici için bir tane atayabilirsiniz. Bir yaklaşım, daha sonra, burada açıklandığı gibi, tüm denetleyici çekirdeklerinin bir denetleyici fasulye tanımından miras kalması için çekirdek mirasını kullanmaktır: http://forum.springsource.org/showthread.php?t=46336 Şu anda bir yolu yok global olarak özel bir MessageCodeResolver tanımlamak için; Bunun için bir geliştirme isteği var: https://jira.springsource.org/browse/SPR-5187 –

+1

Referans için, global custom 'MessageCodeResolver' özelliği en son olarak, Spring 3.1 (2011) 'de uygulandı. Ayrıca bakınız [SPR-6506] (https://jira.spring.io/browse/SPR-6506). – vallismortis

3

Bunlar, MessageSource ve MessagesCodeResolver tarafından çözülür. doğrulama hatalarının tekabül mesajlar çıkışını

tartışmamız gereken son şey:

Here referans kılavuzundaki ilgili bölümdür. Yukarıda gördüğümüz örnekte, adı ve yaş alanını reddettik. Hata mesajlarını bir MessageSource kullanarak çıkaracaksak, alanı reddederken verdiğimiz hata kodunu (bu durumda 'isim' ve 'yaş') kullanarak yapacağız. (Ya doğrudan veya dolaylı olarak, örneğin ValidationUtils sınıfını kullanarak) rejectValue veya Errors arabiriminden diğer reddetme yöntemlerinden birini çağırdığınızda, altta yatan uygulama yalnızca geçirdiğiniz kodu değil, aynı zamanda bir dizi ek hata kodları.

+0

Nereye MessageCodeResolver kullanmak ne tanımlarım: hataları jsp etiketler sonra aşağıdakileri yapabilirsiniz: forma benzer Denetleyicisi mesajları çözmek istiyorsanız Nedense –

+0

varsayılan örneğidir (DefaultMessageCodesResolver). Sadece bir MessageSource kaydettirmeniz gerekir ve bu otomatik olarak kullanılacaktır. –

+0

MessageSource nasıl kaydedilir? MessageCodesResolver öğesini bean özelliği olarak görüyorum. Ancak tüm uygulama genelinde bir MessageCodeResolver'ı evrensel olarak ayarlamanın bir yolu var mı? –

1

? Bir belirtmezseniz,
+0

MessageSource'un denetleyicide @Outowired olabileceğini belirtmek istiyorum – leojh