0

这个想法是这样的:

@PSEUDO_CODE

@AroundInvoke

public Object manage(InvocationContext ic) throws Exception {

    Object object = getTarget();
            ...
            if( businessValidation(object).equals("fail") ){
        return <ERROR MESSAGE + REDIRECT>
    }
    return ic.proceed();
}

任何帮助,如果将不胜感激。

提前致谢

4

2 回答 2

0

抛出特定/自定义异常并<error-page>为此设置特定异常。

例如

if (businessValidationFailed) {
    throw new BusinessValidationException(message);
}

web.xml

<error-page>
    <exception-type>com.example.BusinessValidationException</exception-type>
    <location>/WEB-INF/errorpages/businessvalidationfailed.xhtml</location>
</error-page>

请注意,当您还想在 ajax 请求上处理此问题时,您需要一个自定义异常处理程序,并且您需要一个自定义 servlet 过滤器来解开可能由 JSF 或 EL 自动包装的 Faces 或 EL 异常。JSF 实用程序库OmniFaces为两者提供了解决方案。


与具体问题无关,JSF 中的业务验证通常使用 JSFValidator而不是 Java EE执行Interceptor

于 2013-03-30T11:21:55.800 回答
0

这个替代方案也有效,这正是我想要的

@AroundInvoke
public Object intercept(InvocationContext ic) throws Exception {

    BaseBean<? extends BaseEntity> bean = (BaseBean<?>)ic.getTarget();
    RealmEnum realm = bean.getRealm();
    ActionEnum action = ic.getMethod().getAnnotation(AccessControl.class).action();
    if(!checkAuth(realm, action)){
        return bean.getClass().getMethod("cancel").invoke(bean);
    }
    return ic.proceed();
}

在这里你可以打破方法链并调用你想要的。

return bean.getClass().getMethod("cancel").invoke(bean);

在 Eclipse 中调试时,尝试检查这个“ic.proceed()”返回的内容,然后执行我的 bean 中的方法。有趣的是,他返回了一个“方法执行”。让我试试这个...... =)

我也有注入登录用户的问题。“正常方式”不起作用,如果你有同样的问题,尝试注入你需要的东西,试试这个:

@Inject @LoggedUser 实例记录用户;

对不起,这是谷歌翻译成英文的,希望你明白=)

于 2013-03-31T00:22:01.933 回答