我正在使用针对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 回答
来自球衣
ServerRuntime
类的片段 . 它有一个特殊的逻辑,如果Exception
是WebApplicationException
的一个实例并且有一个主体,它根本不会转到异常映射器 .