簡體   English   中英

ExceptionMapper無法正常工作

[英]ExceptionMapper not working as expected

我將jersey用於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的來源,但沒有發現任何有用的信息,請對此進行指導。

jersey 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM