2013-09-29 72 views
0

我有一個自定義的異常類,需要從屬性文件中讀取一些錯誤消息。但它似乎繼續變爲空。我甚至嘗試添加@Component,但仍然無法正常工作Spring MVC - 無法@Autowire消息源

@Component 
public class FormValidationFailExceptionHolder { 

    @Autowired 
    private MessageSource messageSource; 

    ... 
    public void someMethod(){ 
     .... 
     String message = messageSource.getMessage(errorid, msgargs, Locale.ENGLISH); 
     .... 
    } 
} 

這裏是我的Spring配置

.... 
<context:component-scan base-package="simptex.my" /> 
.... 
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="useCodeAsDefaultMessage" value="false" /> 
    <property name="basenames"> 
     <list> 
      <value>classpath:mgmtlabels</value> 
      <value>classpath:error</value> 
      <value>classpath:PWMResources</value> 
     </list> 
    </property> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 

我甚至試過在Spring配置XML顯式聲明豆,但仍返回空

<bean id="formValidationFailException" class="simptex.my.core.exception.FormValidationFailException"> 
    <property name="messageSource" ref="messageSource" /> 
</bean> 

這是我如何調用FormValidationFailException

public class Foo{ 
    private HttpSession session; 
    .... 
    public void fooMethod() { 
     session.setAttribute(CommonSessionKeys.FORM_VALIDATION_EXECEPTION_HOLDER, new FormValidationFailExceptionHolder("roledd", "E0001")); 
    } 
} 

@Controller 
public class FooController { 
    @RequestMapping(value = "/xxxx") 
    public void fooMethodxxx() { 
     Foo foo = new Foo(session); 
     foo.fooMethod(); 
    } 
} 

回答

0

據我瞭解,你真正想實現的是一個自定義表單驗證器。

@Component 
public class CustomValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return clazz == FormBean.class; 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 
     FormBean bean = (FormBean) target; 

     if (StringUtils.isEmpty(bean.getField())) { 
      errors.rejectValue("field", "field.empty"); 
     } 

    } 
} 

「field.empty」是屬性文件中的一個鍵。

field.empty=Field mustn't be empty 

現在在你的控制器,你需要添加:

@Autowired 
private CustomValidator customValidator; 

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    if (binder.getTarget() instanceof FormBean) { 
     binder.setValidator(customValidator); 
    } 
} 

@RequestMapping(value = "/xxxx", method = RequestMethod.POST) 
    public String fooMethodxxx(@ModelAttribute("bean") @Validated FormBean bean, BindingResult result) { 
     if (result.hasErrors()) { 
      prepareModel(model); 
      return "form.view"; 
     } 
     return "other.view" 
    } 

當你將它張貼將被驗證的形式。要向用戶顯示驗證消息,請在jsp中添加:

<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form"%> 

<f:errors cssClass="error" path="field"></f:errors> 
<f:input path="field" type="text"/> 

我認爲這是處理自定義驗證程序的正確方法。

+0

謝謝..我結束了使用「經典」的方式獲取標籤。有一個使用'ResourceBundleMessageSource' – vincent

+0

vincent - 請你分享你如何解決這個問題。我無法在自定義的AuthenticationEntryPoint中自動調用MessageSource(ResourceBundleMessageSource) –