我正在使用针对REST网络服务的球衣。
每当我没有从服务层获取任何对象时,我就会通过抛出NotFoundException(包com.sun.jersey.api)来处理所有404响应。
e.g。
@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的来源,但没有找到任何有用的内容,请指导我。
答案 0 :(得分:0)
来自球衣['values of D1']
I'm D2
None
None
课程的片段。它有一个特殊的逻辑,如果ServerRuntime
是Exception
的实例并且有一个正文,它根本不会转到异常映射器。
WebApplicationException