JavaEE全局捕获运行时异常

时间:2019-12-14 20:21:23

标签: java java-ee

我想“全局”捕获运行时异常,现在听起来很愚蠢,但是让我解释一下。 我已经在所有需要授权使用的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();
    }
}

现在,我不想在“命名Bean”中使用使用try and catch块的将这些安全豆之一使用的每种方法的主体包围起来,如下所示:

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;
}

因此,有某种方法可以全局捕获运行时异常,如果用户未经身份验证,则将其重定向到登录页面,如果未经授权,则将用户重定向到错误页面。

也许我的设计通常很糟糕,我需要完全重新考虑这个想法。 请让我知道。

谢谢

1 个答案:

答案 0 :(得分:1)

因此,最后,您要捕获异常的是Web层。这很简单:

  • 如果您仅使用servlet,请为每个要处理的异常在web.xml中指定error-page元素,例如如下:

    <error-page>
        <exception-type>fully.quallified.NotAuthenticatedException</exception-type>
        <location>/where/to/redirect/eg/login</location>
    </error-page>
    

    您声明要全局处理的异常以及要处理的URL,它可以是servlet,JSP或任何其他资源。

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

    @Provider
    public class NotAuthenticatedExceptionMapper implements ExceptionMapper<NotAuthenticatedException> {
        ...
    }