将从CDI拦截器引发的异常作为faces消息进行处理



我想在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类

@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>

若我在操作"save()"中写下下面一行,并删除Interceptor,则会显示消息I。

   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的选项。

我对"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;
    }   
}

现在我不会抛出任何异常。

最新更新