gpt4 book ai didi

java - ExceptionMapper 未按预期工作

转载 作者:行者123 更新时间:2023-11-29 02:57:46 27 4
gpt4 key购买 nike

我将 Jersey 用于 REST 网络服务。

每当我没有从服务层获得任何对象时,我都会通过抛出 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);
}

关于java - ExceptionMapper 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33732408/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com