我有一个Spring MVC @Controller
(带有一个Spring Validator
)和一个JSF页面。
我想要的是使用JSF <h:messages />
标记在JSF页面中显示验证错误。
据我所知:
MessageContext
+ MessageBuilder
适用于网络流,但不适用于@Controller
¿有没有办法在不使用Spring MVC代码的情况下从<h:messages />
@Controller
Validator
显示错误?
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
在使用Spring和JSF消息集成后,最终我找到了最简单的方法:
这有效,我认为这是一个干净的整合。