美文网首页
扩展Spring Boot Web应用 - 封装RESTFul接

扩展Spring Boot Web应用 - 封装RESTFul接

作者: nzdxwl | 来源:发表于2019-11-18 00:08 被阅读0次

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

    返回数据以及配置类

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

    @Data
    public class CommonJsonResponse<T> {
    
        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<Object> {
            @Override
            public boolean supports(MethodParameter methodParameter,
                        Class<? extends HttpMessageConverter<?>> aClass) {
                return true;
            }
    
            @Override
            public Object beforeBodyWrite(Object body, MethodParameter methodParameter, 
                                MediaType mediaType,  Class<? extends HttpMessageConverter<?>> 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<Object>(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接

          本文链接:https://www.haomeiwen.com/subject/ymzpictx.html