3

我将球衣用于 REST Web 服务。

每当我没有从服务层获得任何对象时,我都会通过抛出 NotFoundException(Package 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 中的代码。(我可以在响应中看到异常消息,但作为“纯文本”,即使在映射器中我以 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 有什么问题呢?我已经对此进行了谷歌搜索,并查看了 NotFoundException 的来源,但没有发现任何有用的信息,请指导我。

4

1 回答 1

3

ServerRuntime球衣类的片段。它有一个特殊的逻辑,如果它Exception是一个实例WebApplicationException并且有一个主体,它根本不会进入异常映射器。

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);
}
于 2018-05-25T05:01:52.813 回答