2009-12-10 37 views
19

我試圖在Spring MVC框架下編寫validators,但文檔中有明顯的遺漏。當調用將錯誤傳遞給Errors對象時,大多數方法需要一個名爲errorCode的String參數。如果我理解正確,這些錯誤代碼可用作特定錯誤消息的展示位置。但是我不能在生活中找出這些代碼映射到的位置。Spring MVC驗證錯誤代碼在哪裏解決?

這裏是我從Spring MVC的Javadoc中引用的一個例子;

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."); 
     } 
    } 
} 

有誰能夠賜教嗎?

回答

15

我正在使用默認消息解析器。

在我dispatcher-servlet.xml,我有

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

,然後在我的classes目錄的頂層我有一個包含的映射,比如這個名爲「messages.properties」的文本文件:

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

如果您想使用自定義MessageCodesResolver,則可以實現MessageCodeResolver接口,然後爲給定控制器定義解析器,如下所示:

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

目前沒有辦法定義全球定製的MessageCodeResolver;有一個enhancement request for that here。使用bean繼承使所有控制器bean從一個控制器bean定義繼承的一種方法描述爲here

+0

感謝您的信息,這使我足以使用我的驗證器。但爲了學習如果我想在自定義MessageCodeResolver中重新連接,我該怎麼做,我該去哪裏?也只是爲了繁榮ResourceBundleMessageSource的javadoc位於http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.html。 – 2009-12-10 16:13:44

+1

如果您想使用自定義的MessageCodeResolver,您可以爲給定的控制器分配一個。然後,一種方法是使用bean繼承來使所有控制器bean從一個控制器bean定義繼承,如下所述:http://forum.springsource.org/showthread.php?t=46336目前還沒有辦法全局定義一個自定義的MessageCodeResolver;這裏有一個增強請求:https://jira.springsource.org/browse/SPR-5187 – 2009-12-10 18:45:47

+1

作爲參考,全局自定義的'MessageCodeResolver'功能最終在Spring 3.1(2011)中實現。另見[SPR-6506](https://jira.spring.io/browse/SPR-6506)。 – vallismortis 2017-08-30 16:00:19

3

他們由您的MessageSourceMessagesCodeResolver解決。

Here是在參考手冊中的相關章節:

輸出對應的驗證錯誤消息是我們需要討論的最後一件事。在上面的例子中,我們拒絕了名字和年齡段。如果我們要使用MessageSource輸出錯誤消息,那麼我們將使用我們在拒絕該字段(本例中爲'name'和'age')時給出的錯誤代碼。當您直接或間接地使用ValidationUtils類(ValidationUtils類)rejectValue或其他拒絕方法之一(Errors接口)調用(直接或間接)時,底層實現不僅會註冊您傳入的代碼,還會註冊一些其他錯誤代碼。

+0

你在哪裏定義什麼MessageCodeResolver使用? – 2009-12-10 14:44:38

+0

如果不指定默認實例(DefaultMessageCodesResolver),則使用默認實例。你應該只需要註冊一個MessageSource,並且它會被自動使用。 – 2009-12-10 14:48:23

+0

你如何註冊MessageSource?我將messageCodesResolver看作bean屬性。但是有沒有辦法在整個應用程序中將MessageCodeResolver設置爲通用? – 2009-12-10 15:01:58

1

因爲如果你想在類似形式的控制器來解決郵件某些原因:錯誤的JSP標籤,那麼你可以做到以下幾點:

//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

我想指出MessageSource可以在控制器中使用@Autowired – leojh 2014-01-20 22:46:51