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