Spring @Controller,Validator和JSF <h:messages>标记</h:messages>

时间:2013-12-10 15:32:09

标签: spring jsf spring-mvc

我有一个Spring MVC @Controller(带有一个Spring Validator)和一个JSF页面。

我想要的是使用JSF <h:messages />标记在JSF页面中显示验证错误

据我所知:

  • MessageContext + MessageBuilder适用于网络流,但不适用于@Controller
  • 我已经阅读了关于Validation的Spring文档,似乎(最后一段)是使用Spring MVC标记的唯一方法。

¿有没有办法在不使用Spring MVC代码的情况下从<h:messages /> @Controller Validator显示错误?

2 个答案:

答案 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消息集成后,最终我找到了最简单的方法:

  • 直接在应用程序控制器中添加面部消息(尽管@M.Deinum显示了体系结构解决方案)
  • 使用jsf验证器而不是spring验证器,仍然可以访问spring上下文

这有效,我认为这是一个干净的整合。