处理从CDI拦截器抛出的异常作为面部消息

时间:2015-06-22 09:24:21

标签: jsf exception-handling cdi interceptor

我想在xhtml中显示异常消息。执行是在拦截器中生成的。

拦截班:

    @Logable
    @Interceptor
    public class LoggingInterceptor
    {
        @AroundInvoke
        public Object log(InvocationContext ctx)
            throws Exception {
            if (some logic)
                FacesContext.getCurrentInstance().addMessage("newBandForm:ABCD", new FacesMessage(FacesMessage.SEVERITY_ERROR, "hklfhfhsf", "hklfhfhsf"));
                throw new Exception("MNOP");
            return ctx.proceed();
    }

Action Bean Class

@Named("bcontroller")
@RequestScoped
public class BandListController
{
   @Logable
    public void save()
    {
    }
}

我想在xhtml p:message

中显示异常
<h:form id="newBandForm">
    <p:messages id="ABCD" autoUpdate="false" closable="true" showDetail="false" escape="false"/>
</h:form>

如果我在Action“save()”本身中编写以下行,并删除Interceptor,则会显示消息。

   FacesContext.getCurrentInstance().addMessage("newBandForm:ABCD", new FacesMessage(FacesMessage.SEVERITY_ERROR, "hklfhfhsf", "hklfhfhsf"));

似乎异常抛出也会中断JSF组件的生命周期。
谢谢

详情要求:

我有一个xhtml页面,其中包含一个字段(例如:F1)和两个commandButton(例如:C1和C2)。对于C1按钮,F1是强制性的,对于C2,则不是。这是完全可配置的,在bean初始化时,我从数据库中获取数据,对于哪个按钮,哪些字段是必需的。

现在在查找@Logable注释时,我正在调用拦截器方法来根据操作检查数据一致性。如果验证失败,我必须设置p:message(我正在访问FaceContext)。

为什么我这样做?因此,单个注释可以在不更改主要操作代码的情况下启用安全性。

在搜索“JSF中的aop”后,我最终得到了javax“拦截器”。我没有选择在项目中实现spring-aop。

1 个答案:

答案 0 :(得分:0)

我对“ctx.proceed()”缺乏了解导致我遇到这些问题。它的作用是“继续拦截链中的下一个拦截器。”如果没有,流量将照常恢复。

(解决方法)更改此类代码可以解决我的问题:

@AroundInvok
public Object log(InvocationContext ctx)
    throws Exception {
    if (!(some logic))
    {
        return ctx.proceed();
    }
    else
    {
        FacesContext.getCurrentInstance().addMessage("newBandForm:ABCD", new FacesMessage(FacesMessage.SEVERITY_ERROR, "hklfhfhsf", "hklfhfhsf"));
        return null;
    }   
}

现在我没有抛出任何例外。