扩展Spring Boot Web应用 - 封装RESTFul接口返回数据

在提供RESTFul接口时,我们有时希望这些接口返回的数据能以固定格式提供给调用方,以下以返回数据封装成固定的json格式为例。

返回数据以及配置类

返回数据类
使用泛型来包含不同的对象,有错误代码、错误信息以及当前时间三个字段,使用lombok省略getter和setter

@Data
public class CommonJsonResponse {

    public CommonJsonResponse() {    }
    public CommonJsonResponse(T respBody) {  this.respBody = respBody;   }

    private String errorCode = "";
    private String errorMsg = "";
    private T respBody;    
    public String getTimestamp() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(JSON.DEFFAULT_DATE_FORMAT));
    }
}

配置类

  • @Configuration注解标识这是配置类,
  • @Bean 表示创建HttpMessageConverters实例,这个bean实际是FastJsonHttpMessageConverter的实例,并且只支持返回数据类型是“application/json”或者“application/json;charset=UTF-8”的转换,由于之前添加的依赖项spring-cloud-starter-alibaba-sentinel和sentinel-datasource-nacos均包含有fastjson依赖,所以这次修改不需要添加新的依赖项,而且上面两个依赖项可以只保留一个fastjson的引用即可。
  • @RestControllerAdvice则是配置aop拦截,指定拦截“com.example.quickstart.controller”包下面的控制器;在写返回数据时进行判断,如果返回类型是CommonJsonResponse类的实例或者MediaType是我们添加的转换器支持的类型时,则直接返回或者进行包装,其他类型则不进行处理。
@Configuration
public class WebConfig {

    @Bean
    public HttpMessageConverters customConverters() {
        //FastJsonHttpMessageConverter和FastJsonConfig默认的charset均是UTF-8
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, 
                                                       MediaType.APPLICATION_JSON_UTF8));
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(SerializerFeature.PrettyFormat,    //格式化json 
                                     SerializerFeature.WriteDateUseDateFormat);// 格式化时间
        converter.setFastJsonConfig(config);
        return new HttpMessageConverters(converter);
    }

    @RestControllerAdvice("com.example.quickstart.controller")
    static class CommonJsonResponseResponseAdvice implements ResponseBodyAdvice {
        @Override
        public boolean supports(MethodParameter methodParameter,
                    Class> aClass) {
            return true;
        }

        @Override
        public Object beforeBodyWrite(Object body, MethodParameter methodParameter, 
                            MediaType mediaType,  Class> aClass,
                           ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
            if (body instanceof CommonJsonResponse) {
                return body;
            } else if (MediaType.APPLICATION_JSON.equals(mediaType)
                    || MediaType.APPLICATION_JSON_UTF8.equals(mediaType)) {
                return new CommonJsonResponse(body);
            }
            return body;
        }
    }
}

添加以上两个类后,我们再调用com.example.quickstart.controller包下面的RESTFul接口时,如果该接口默认是“application/json”或者使用 produces = "application/json" 指示返回数据类型时,返回信息均会以类似以下格式返回:

{
    "errorCode":"",
    "errorMsg":"",
    "respBody":{
        "age":19,
        "birthday":"2000-04-01",
        "usercode":"001",
        "username":"test user"
    },
    "timestamp":"2019-11-17 21:18:23"
}

这样我们就简单实现了对RESTFul接口返回数据的封装。

你可能感兴趣的:(扩展Spring Boot Web应用 - 封装RESTFul接口返回数据)