我正在使用Jersey来实现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中的代码没有被调用。(我可以在响应中看到异常消息,但作为'纯文本',即使在映射器中我返回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的源码,但没有找到任何有用的信息,请指导我。