处理从 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;
}
}
现在我不会抛出任何异常。
我想在 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;
}
}
现在我不会抛出任何异常。