REST-EJB AccessLocalException 导致 BadRequest(500) 而不是 Unauthorized(401)

REST-EJB AccessLocalException causes BadRequest(500) instead of Unauthorized(401)

我得到异常:

Warning:   StandardWrapperValve[org.netbeans.rest.application.config.ApplicationConfig]: Servlet.service() for servlet org.netbeans.rest.application.config.ApplicationConfig threw exception
javax.ejb.AccessLocalException: Client not authorized for this invocation

这是完全正常的,因为它没有被授权调用这个方法。

不幸的是,由于此 EJB 也是一个 REST 服务,它会抛出“500 - 错误请求”http 状态。相反,我想要一个“401 - 未经授权”。

我应该不使用 EJB 安全性还是应该在 ApplicationConfig 中捕获此 AccessLocalException 还是应该使用 Jersey 来实现 REST 安全性?

角色在 web.xml 中定义,注释放在 EJB Bean 上。

您可以定义一个 ExceptionMapper,它将一般异常映射到 HTTP 响应。

import javax.ejb.EJBAccessException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class EJBAccessExceptionMapper implements
        ExceptionMapper<EJBAccessException>
{
  @Override
  public Response toResponse(EJBAccessException exception)
  {
    return Response.status(Response.Status.UNAUTHORIZED).build();
  }
}