我正在将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中的代码。 (我可以在响应中看到异常消息,但显示为“纯文本”,即使在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有什么问题呢?
我已经对此进行了搜索,还调查了NotFoundException的来源,但没有发现任何有用的信息,请对此进行指导。
最佳答案
球衣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);
}
关于java - ExceptionMapper无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33732408/