可能,在cdi拦截器中,验证后,将用户重定向到另一个页面/方法/操作(jsf2)并发送消息?

时间:2013-03-30 04:47:55

标签: java jsf-2 java-ee-6 cdi interceptor

这个想法是这样的:

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

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

提前致谢

2 个答案:

答案 0 :(得分:0)

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

E.g。

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

with web.xml

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

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


对于具体问题

无关,JSF中的业务验证通常使用JSF Validator执行,而不是使用Java EE Interceptor

答案 1 :(得分: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 Instance loggedUser;

抱歉,这被谷歌翻译成英文,希望你明白这个想法=)