0

我有一个 Web 应用程序,我在其中抛出了一些自定义异常(用 注释的应用程序异常@ApplicationException),并且每个都有一个异常映射器(用 注释的提供程序@Provider)。最近我忘记用 @ApplicationException 注释异常,但映射器仍然能够识别异常并正确格式化响应。

然后我检查了文档,我了解到注解默认会被其子类继承。所以我从超类中删除了注释并进行了检查。映射器仍然识别异常并格式化响应。

然后我甚至向前尝试投掷java.lang.IllegalArgumentException并为它编写了一个映射器类。它也正常工作。与抛出的javax.ws.rs.ext.ExceptionMapper异常无关。它不会检查抛出的异常是否真的用 注释@ApplicationException

@Provider
public class IllegalArgumentExceptionMapper implements ExceptionMapper<java.lang.IllegalArgumentException> {

    @Override
    public Response toResponse(java.lang.IllegalArgumentException exception) {
        return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
    }

}

在我的服务班的某个地方:

throw new java.lang.IllegalArgumentException("Problem with the payload. Please check the payload you are sending");
4

1 回答 1

0

答案是否定的,它不会检查抛出的异常是否真的用@ApplicationException注释。异常映射器独立于@ApplicationException。

异常映射器所知道的是,如果直到几乎最后一层都没有捕获到异常,如果它找到匹配的提供程序,它将在这里处理。

您实际上也可以为 RuntimeException 创建一个提供程序,并且 REST 请求中发生的所有异常都将落在此处(但这不是好的做法,我们应该始终抛出自定义异常并使用提供程序捕获它们并将它们转换为良好的错误响应)。

当您使用 @ApplicationException 注释异常时,您可以控制事务是否应该回滚,以及它是否将被 EJBException 包装等。

于 2014-08-13T23:49:49.580 回答