我已经实现了一些自定义异常,例如:NotFoundException、BadRequestException、
对于它们中的每一个,我都实现了自己的 ExceptionMapper,例如NotFoundExceptionMapper、BadRequestExceptionMapper以及类似GenericExceptionMapper的东西:
@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {
@Override
@Produces( {MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON} )
public Response toResponse(Throwable ex) {
ErrorResponseWrapper errorResponse = new ErrorResponseWrapper(ex.getMessage(), 500, "");
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build();
}
}
首先,这里的问题是GenericExceptionMapper不能像我预期的那样工作,它不会捕获 JAX-RS 抛出的通用异常,因为我认为这样的 Mapper 捕获的每个异常都必须尽早从 getResource() throws之类的方法中显式抛出一些异常{
此外,问题是在RestEasy中我需要在 web.xm 中注册异常映射器。见下文:
<!-- Custom exception handling provider -->
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>pl.salonea.jaxrs.exceptions.GenericExceptionMapper</param-value>
</context-param>
这是另一个问题,因为我无法注册(或者我不知道如何注册)我定义的每个自定义 ExceptionMapper。我只能注册 SINGLE 自定义 ExceptionMapper。 如何全部注册?即NotFoundExceptionMapper、BadRequestExceptionMapper等。
所以现在每个异常只由通用异常映射器映射,这是第一个问题。
这是RESTEasy的限制吗?在泽西岛的一些教程中,我没有看到需要注册这样的异常映射器,但我也不知道是否可以有多个异常映射器。
我想到的另一个解决方案(解决方法)是使用单个 GenericExceptionMapper 并在toResponse(Throwable ex)方法中进行一些检查,例如:
if(ex instanceof NotFoundException) { // send response type 1
if(ex instanceof BadRequestException) { // send response type 2
谢谢帮助