我正在使用 Jersey/JAX-RS 来实现 RESTful Web 服务。我有一个关于 ExceptionMapper
interface 的问题,它似乎没有记录在任何地方。
假设我有以下自定义(扩展 RuntimeException
)异常:
FizzException extends RuntimeException
BuzzException extends FizzException
现在假设我希望我的异常映射器执行以下
Exception
-to- Response
映射:FizzException
实际上映射到 HTTP 404 NOT FOUND BuzzException
映射到 HTTP 403 UNAUTHORIZED 因此,如果我正确理解 API,我需要实现 3 个不同的异常映射器:
@Provider
public class DefaultExceptionMapper implements ExceptionMapper<Exception> {
@Override
Response toResponse(Exception exc) {
// Map to HTTP 500
}
}
@Provider
public class FizzExceptionMapper implements ExceptionMapper<FizzException> {
@Override
Response toResponse(Exception exc) {
// Map to HTTP 404
}
}
@Provider
public class BuzzExceptionMapper implements ExceptionMapper<BuzzException> {
@Override
Response toResponse(Exception exc) {
// Map to HTTP 403
}
}
然而,这让我很好奇:既然我们正在进行异常类继承,那么哪些映射器实际上会触发?例如:
BuzzException
扩展 FizzException
,最终扩展 Exception
。因此,如果抛出 BuzzException
,将触发哪个映射器: BuzzExceptionMapper
、 FizzExceptionMapper
或 DefaultExceptionMapper
? Exception
时,因为 BuzzException
最终是 Exception
,映射器会触发: BuzzExceptionMapper
、 FizzExceptionMapper
还是 DefaultExceptionMapper
? 最佳答案
将调用最具体的异常映射器 。
所以在你的情况下:
BuzzException
将被 BuzzExceptionMapper
FizzException
将被 FizzExceptionMapper
Exception
将由 DefaultExceptionMapper
关于java - Jersey/JAX-RS ExceptionMappers 和继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27422793/