Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaEE全局捕获运行时异常_Java_Jakarta Ee - Fatal编程技术网

JavaEE全局捕获运行时异常

JavaEE全局捕获运行时异常,java,jakarta-ee,Java,Jakarta Ee,我想“全局”捕获一个运行时异常,现在这听起来很愚蠢,但让我解释一下。 我已经创建了一个拦截器,我在所有需要授权才能使用的EJB上使用它,每次调用一个方法时都会调用这个拦截器 请参见以下代码: @Secure @Interceptor public class SecurityInterceptor { @EJB private SessionManager sessionManager; @AroundInvoke private Object securit

我想“全局”捕获一个运行时异常,现在这听起来很愚蠢,但让我解释一下。 我已经创建了一个拦截器,我在所有需要授权才能使用的EJB上使用它,每次调用一个方法时都会调用这个拦截器

请参见以下代码:

@Secure
@Interceptor
public class SecurityInterceptor {

    @EJB
    private SessionManager sessionManager;

    @AroundInvoke
    private Object securityCheck(InvocationContext ctx) throws Exception {
        System.out.println("hello");
        List<UserGroup> allowedRoles = (List<UserGroup>) ctx.getContextData().get("rolesAllowed");
        sessionManager.isAuthorized(allowedRoles);
        return ctx.proceed();
    }
}
@Secure
@拦截器
公共类安全拦截器{
@EJB
私有会话管理器会话管理器;
@阿隆登沃克
私有对象安全检查(InvocationContext ctx)引发异常{
System.out.println(“你好”);
List allowedRoles=(List)ctx.getContextData().get(“rolesAllowed”);
sessionManager.isAuthorized(允许角色);
返回ctx.procedure();
}
}
现在,我不想在我的命名Bean中,用try-and-catch块来包围使用这些安全Bean的每个方法的主体,如下所示:

public List<Contracts> getContracts() {
    List<Contracts> contracts = new ArrayList<>();
    try {
        contracts = contractEntityManager.getAll();
    } catch (EJBTransactionRolledbackException e) {
        Throwable throwable = ExceptionUtils.getRootCause(e);
        if (throwable instanceof NotAuthenticatedException) {
            System.out.println("Not Authenticated");
        }
        else if (throwable instanceof UnAuthorizedException) {
            System.out.println("Not Authorized");
        }
    }
    return contracts;
}
public List getContracts(){
List contracts=new ArrayList();
试一试{
contracts=contractEntityManager.getAll();
}捕获(EJBTransactionRolledbackException e){
Throwable-Throwable=ExceptionUtils.getRootCause(e);
if(NotAuthenticationDexception的可丢弃实例){
System.out.println(“未认证”);
}
else if(未授权异常的可丢弃实例){
系统输出打印项次(“未授权”);
}
}
归还合同;
}
因此,是否有某种方法可以全局捕获运行时异常,并在用户未经身份验证时将其重定向到登录页面,在用户未经身份验证时将其重定向到错误页面

也许我的设计总体上不好,我需要彻底反思这个想法。 请让我知道


谢谢

因此,最后,您希望捕获异常的是web层中的异常。这很简单:

  • 如果您仅在servlet上,请在web.xml中为您希望处理的每个异常指定
    错误页
    元素,例如:

    
    完全.qualified.NotAuthenticatedException
    /where/to/redirect/eg/login
    
    声明要全局处理的异常和要处理的URL,它可以是servlet、JSP或任何其他资源

  • JAX-RS与
    javax.ws.RS.ext.ExceptionMapper
    提供了类似的机制:

    @Provider
    公共类NotAuthenticationDexceptionMapper实现ExceptionMapper{
    ...
    }
    

因此,基本上您是在询问是否可以向拦截器代码中添加try-catch块?不,我希望我的拦截器引发此异常,因为在web层(名为bean等)中,我希望将用户重定向到登录页或错误页。或者我可以在服务器层也这样做吗?非常感谢,错误页面标签就是我要找的。尽管我不得不使用Omnifaces FacesceCeptionFilter,因为有些异常被包装在FacesceCeption中。此外,我还必须在ejb级别将我的异常注释为@ApplicationException,以避免包装异常:)