在提供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接口返回数据的封装。
网友评论