【问题标题】:Stop GlassFish wrapping Jersey exceptions停止 GlassFish 包装 Jersey 异常
【发布时间】:2014-03-18 15:25:00
【问题描述】:

这是一个 JAX-RS 端点:

@Path("logout")
@POST
public void logout(@HeaderParam("X-AuthToken") String apiToken) {
    try {
        authenticationService.logout(apiToken);
    } catch (ExpiredApiTokenException exc) {
        throw new BadRequestException("API token has expired");
    } catch (InvalidApiTokenException exc) {
        throw new BadRequestException("API token is not valid");
    } catch (ApplicationException exc) {
        throw new InternalServerErrorException();
    }
}

当其中一个BadRequestExceptions (HTTP 400) 被抛出时,GlassFish 在响应正文中返回它自己的错误页面,而不是在我的代码中返回错误消息。响应包含正确的 HTTP 代码。只是身体被替换了。

我已经尝试创建一个ExceptionMapper:

@Provider
public class ExceptionMapperImpl implements ExceptionMapper<Throwable> {

    @Override
    public Response toResponse(Throwable exception) {
        if (exception instanceof WebApplicationException) {
            return ((WebApplicationException) exception).getResponse();
        } else {
            logger.log(Level.SEVERE, "Uncaught exception thrown by REST service", exception);
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
        }
    }

    private static final Logger logger = Logger.getLogger(ExceptionMapperImpl.class.getName());
}

我尝试添加以下 ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         version="3.2"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd">
    <assembly-descriptor>
        <application-exception>
            <exception-class>javax.ws.rs.WebApplicationException</exception-class>
            <rollback>true</rollback>
        </application-exception>
    </assembly-descriptor>
</ejb-jar>

一切都无济于事。

我错过了什么?

【问题讨论】:

  • 您明确要求 WebApplicationException 的响应(因为 BadRequestException 是 WebApplicationException)。
  • 您能详细说明一下吗?我在哪里做这个?我应该怎么做?仅供参考 - 我尝试了所有四种组合:带/不带提供程序和带/不带 ejb-jar.xml。四种情况下的行为相同。
  • 在您的异常映射器中,您有 if (exception instanceof WebApplicationException),这对于 BadRequestException 是正确的,然后您从那里获得 WebApplicationException 的响应。我敢打赌你想做的是建立你自己的回应(可能通过明确检查BadRequestException)。
  • 没有。我想要做的是得到一个响应,其正文只包含我传递给异常构造函数的消息字符串。仅供参考 - 似乎提供者被完全忽略了。 toResponse 永远不会被调用。
  • ExceptionMapperImpl 现在被调用(刚刚开始工作)。我将其更改为返回 Response.ok().build() 而不是 ((WebApplicationException) exception).getResponse() 并且有效,但是当我将其更改回来时,GlassFish 仍然返回自己的页面,尽管异常映射器正在返回自己的响应。

标签: java jersey jax-rs glassfish-4


【解决方案1】:

toResponse方法中,我改变了这个

return exception.getResponse();

到这里

return Response.status(exception.getResponse().getStatus())
               .entity(exception.getMessage())
               .build();

问题是当我这样做时:

throw new BadRequestException("Something is wrong!");

它不会用"Something is wrong!" 填充异常的Response 正文。 GlassFish 看到响应体是空的,并且它的状态码是错误码,所以它插入了自己的响应体。通过在提供者中填充响应主体(也称为实体),这个问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2017-07-10
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-05-30
    相关资源
    最近更新 更多