为什么java ws-rs ExceptionMapper也在挑选非应用程序异常?

为什么java ws-rs ExceptionMapper也在挑选非应用程序异常?,java,jakarta-ee,ejb-3.0,java-ws,Java,Jakarta Ee,Ejb 3.0,Java Ws,我有一个web应用程序,我在其中抛出一些自定义异常(用@ApplicationException注释的应用程序异常),每个异常都有一个异常映射器(用@provider注释的提供程序)。最近我忘记了用@ApplicationException注释异常,映射程序仍然能够识别异常并正确格式化响应 然后我检查了文档,了解到默认情况下注释将由其子类继承。因此,我从超类中删除了注释并进行了检查。映射程序仍然识别了异常并格式化了响应 然后我甚至尝试抛出java.lang.IllegalArgumentExce

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

然后我检查了文档,了解到默认情况下注释将由其子类继承。因此,我从超类中删除了注释并进行了检查。映射程序仍然识别了异常并格式化了响应

然后我甚至尝试抛出
java.lang.IllegalArgumentException
,并为此编写了一个映射器类。它也能正常工作。与抛出的异常无关。它不会检查抛出的异常是否真的用
@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();
    }

}

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

异常映射程序所知道的是,如果在几乎最后一层之前没有捕获到异常,那么如果找到匹配的提供程序,它将在这里进行处理

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


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

@ApplicationException是专有注释还是众所周知的东西?找不到这样的东西它是javax.ejb api中的一个著名注释。+你能提供你的ExceptionMapper代码吗?@shlomi33我更新了帖子。所以我可能不明白@ApplicationException与整个问题有什么关系。你能再解释一下吗?
throw new java.lang.IllegalArgumentException("Problem with the payload. Please check the payload you are sending");