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

Handle exception thrown from a CDI interceptor as a faces message

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

拦截器 class :

    @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();
    }

动作豆 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()" 本身中编写以下行,并删除拦截器,则会显示消息。

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

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

详细要求:

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

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

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

我在搜索 "aop in JSF" 后在 javax "interceptor" 中结束。我没有在项目中实施 spring-aop 的选项。

我对 "ctx.proceed()" 缺乏了解导致我想到这个 problems.What 它确实是 "Proceed to the next interceptor in the interceptor chain." 如果没有,流程将照常恢复。

(解决方法)像这样更改代码解决了我的问题:

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

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