不是默認情況下沒有。
你可以做的是創建一個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;
}
}
謝謝Deinum先生。只有1個問題。此時FacesContext爲'null'。正如我所看到的,在實際創建Spring JsfView的FacesContext之前,處理程序被執行('DispatcherServlet')。我們正在接近尋找解決方案...;) –
一槍,你說得對。但是您正在使用'JsfView',這也意味着您正在使用Spring Web Flow。而不是攔截器使用自定義的'ViewFactory',它返回一個自定義'JsfView',它將消息放入'FacesContext'中。目前的'JsfView'不這樣做。 –