2013-12-10 72 views
0

我有一個Spring MVC @Controller(帶有一個Spring Validator)和一個JSF頁面。Spring @Controller,Validator和JSF <h:messages />標記

我想要的是在使用JSF <h:messages />標記的JSF頁面中顯示驗證錯誤

據我所知:

  • MessageContext + MessageBuilder作品webflows,但它不適用於@Controller
  • 我讀過Spring文檔有關Validation,似乎(最後一段)的唯一方式是使用Spring MVC標籤。

¿有沒有辦法來顯示我@ControllerValidator<h:messages />錯誤,而無需使用Spring MVC的標籤?

回答

0

與Spring和JSF的消息整合鬼混後,終於讓我找到的最簡單的方法是:

  • 添加直接在應用控制器面向消息(儘管@M。Deinum示出的體系結構的解決方案)
  • 使用JSF驗證器,而不是彈簧驗證器,仍然可以訪問該彈簧背景

這樣的作品,我認爲這是一個乾淨的整合。

1

不是默認情況下沒有。

你可以做的是創建一個HandlerInterceptor,它實現了postHandle方法(我假設你使用正常的Spring MVC事物)。在這種方法中,您可以查找BindingResult類型的所有模型屬性,從中檢索所有錯誤並將它們傳送到JSF。

像這樣的東西應該工作(沒有測試它,要看你用什麼還)

public class ErrorTransferingInterceptor extends HandlerInterceptorAdapter implements MessageSourceAware { 

    private MessageSource messageSource; 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
     FacesContext ctx = FacesContext.getCurrentInstance(); 
     for (Object o : modelAndView.getModel().values()) { 
      if (o instanceof Errors) { 
       Errors result = (Errors) o; 
       for (ObjectError err : result.getAllErrors()) { 
        String msg = messageSource.getMessage(err, LocaleContextHolder.getLocale()); 
        if (err instanceof FieldError) { 
         ctx.addMessage(((FieldError) err).getField(), new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, null)); 
        } else { 
         ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, null)); 
        } 
       } 
      } 
     } 
    } 

    @Override 
    public void setMessageSource(MessageSource messageSource) { 
     this.messageSource=messageSource; 
    } 
} 
+0

謝謝Deinum先生。只有1個問題。此時FacesContext爲'null'。正如我所看到的,在實際創建Spring JsfView的FacesContext之前,處理程序被執行('DispatcherServlet')。我們正在接近尋找解決方案...;) –

+1

一槍,你說得對。但是您正在使用'JsfView',這也意味着您正在使用Spring Web Flow。而不是攔截器使用自定義的'ViewFactory',它返回一個自定義'JsfView',它將消息放入'FacesContext'中。目前的'JsfView'不這樣做。 –

相關問題