我将球衣用于 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 的来源,但没有发现任何有用的信息,请指导我。