【问题标题】:Why is java ws rs ExceptionMapper is picking non application exceptions also?为什么 java ws rs ExceptionMapper 也在挑选非应用程序异常?
【发布时间】:2014-08-14 07:49:49
【问题描述】:

我有一个 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");

【问题讨论】:

  • @ApplicationException 是专有注释还是众所周知的?找不到这样的东西
  • 这是 javax.ejb api 中众所周知的注解。
  • + 你能提供你的 ExceptionMapper 代码吗?
  • @shlomi33 我更新了帖子。
  • 所以我可能不明白@ApplicationException 与这里的整个问题有什么关系。能再解释一下吗?

标签: java jakarta-ee ejb-3.0 java-ws


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2011-03-16
    • 2011-04-24
    相关资源
    最近更新 更多