Jersey框架:统一响应404请求

1.业务场景

在Jersey框架中,如果用户访问不存在的资源路径,默认会调用Jersey自己的异常处理机制,返回类似下图的响应,不利于前端处理404请求。
Jersey框架:统一响应404请求_第1张图片
本文介绍一种统一处理404NotFound请求响应的方式,利用Jersey的异常映射机制,将NotFoundException统一处理,请求响应如下。

{
     "status":404,"message":"HTTP 404 Not Found","developerMessage":null}

2.代码实现

2.1封装错误消息对象

public class ErrorMessage {
     
    /**
     * 状态码
     */
    int status;
    /**
     * 精要错误信息
     */
    String message;
    /**
     * 详细错误信息
     */
    String developerMessage;

    public ErrorMessage(NotFoundException ex) {
     
        this.status = Response.Status.NOT_FOUND.getStatusCode();
        this.message = ex.getMessage();
    }

// getter setter方法省略

2.2映射异常

package org.bigdata.exception;

import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class NotFoundExceptionMapper implements ExceptionMapper<NotFoundException> {
     
    @Override
    public Response toResponse(NotFoundException ex) {
     
        return Response.status(ex.getResponse().getStatus())
                .entity(new ErrorMessage(ex))
                .type(MediaType.APPLICATION_JSON)
                .build();
    }
}

2.3服务启动

确保将exception资源包注册到Jersey框架,启动服务。

public class UserServer {
     
    public static void main(String[] args) throws Exception {
     
        CommonServer server = new CommonServer(8081, "/","org.bigdata.exception");
        server.start();
    }
}

3.测试

访问一个不存在资源地址http://localhost:8081/api/ai,响应如下:

{
     "status":404,"message":"HTTP 404 Not Found","developerMessage":null}

完整案例代码:https://github.com/majxbear/jetty-rest

你可能感兴趣的:(Jersey系列:实践全干货,Jersey,Jersey,404响应,NotFound)