首页 文章

ExceptionMapper无法按预期工作

提问于
浏览
2

我正在使用针对REST Web服务的泽西 .

每当我没有从服务层获取任何对象时,我通过抛出NotFoundException(包com.sun.jersey.api)来处理所有404响应 .

例如

@GET
@Path("/{folderID}")
@Produces(MediaType.APPLICATION_JSON)
public Response getFolder(@PathParam("folderID") int folderID) {
       .
       .
       .
       Folder folderObj = folderService.getFolder(folderID);
       if(folderObj == null){
            throw new NotFoundException("Folder with ID '"+folderID+"'  not found.");
       }
}

我为此异常编写了ExceptionMapper .

@Provider
public class NotFoundExceptionMapper implements   ExceptionMapper<NotFoundException> {

public Response toResponse(NotFoundException ex) {
    ErrorMesage errorMessage = new ErrorMessage();
    errorMessage.setCode(Status.NOT_FOUND.getStatusCode());
    errorMessage.setMessage(ex.getMessage());

    return Response.status(Status.NOT_FOUND)
            .entity(errorMessage)
            .type(MediaType.APPLICATION_JSON)
            .build();
}

}

因此,当我将未知文件夹ID作为路径参数提供时,将抛出异常,但不会调用NotFoundExceptionMapper中的代码 . (我可以在响应中看到异常消息但是作为'纯文本',即使在mapper中我在JSON中返回响应;并且调试断点也未被命中) .

此外,当我在URI中输入不正确的资源名称时调用上面的异常映射器,但是对于不正确的路径参数则不会 .

我还添加了如下的异常映射器来响应所有其他异常 .

public class GenericExceptionMapper implements  ExceptionMapper<Throwable>{

public Response toResponse(Throwable ex) {
    ErrorMessage errorMessage = new ErrorMessage();
    errorMessage.setCode(Status.INTERNAL_SERVER_ERROR.getStatusCode());
    errorMessage.setMessage(ex.getMessage());


    return Response.status(errorMessage.getCode())
            .entity(errorMessage)
            .type(MediaType.APPLICATION_JSON)
            .build();   
}

每当抛出任何异常(除了映射异常)并且我得到适当的JSON响应时,就调用上面的代码 .

那么这里的NotFoundException有什么问题?我已经google了这个,也查看了NotFoundException的来源,但没有找到任何有用的东西,请指导我这个 .

1 回答

  • 0

    来自球衣 ServerRuntime 类的片段 . 它有一个特殊的逻辑,如果 ExceptionWebApplicationException 的一个实例并且有一个主体,它根本不会转到异常映射器 .

    private Response mapException(Throwable originalThrowable) throws Throwable {
        if (throwable instanceof WebApplicationException) {
            WebApplicationException webApplicationException = (WebApplicationException)throwable;
         }
    
        this.processingContext.routingContext().setMappedThrowable(throwable);
        waeResponse = webApplicationException.getResponse();
        if (waeResponse.hasEntity()) {
            LOGGER.log(java.util.logging.Level.FINE, LocalizationMessages.EXCEPTION_MAPPING_WAE_ENTITY(waeResponse.getStatus()), throwable);
            return waeResponse;
        }        
    
        long timestamp = this.tracingLogger.timestamp(ServerTraceEvent.EXCEPTION_MAPPING);
        ExceptionMapper mapper = this.runtime.exceptionMappers.findMapping(throwable);
    }
    

相关问题