✅作者简介:大家好,我是小杨
📃个人主页:「小杨」的csdn博客
🐳希望大家多多支持🥰一起进步呀!
1,统一数据格式返回的介绍
统一数据返回是指在进行接口开发时对返回数据进行规范和统一处理,确保返回数据的格式和结构保持一致。
可以通过使用@ControllerAdvice
注解结合ResponseBodyAdvice
接口实现统一的数据返回格式。
@ControllerAdvice
注解用于定义一个全局通知的类,可以用于定义一些全局处理逻辑,例如异常处理、数据绑定、数据格式化等。该注解声明的类可以包含异常处理方法、绑定前和绑定后的拦截方法,以及其他的通用处理逻辑。ResponseBodyAdvice
接口是Spring框架提供的一个拦截响应体的接口,它可以在响应体返回给客户端之前对响应数据进行处理。通过实现该接口,在拦截器中可以对数据进行统一的封装、格式化或加工,以实现统一的数据返回格式。
2,统一数据格式返回的实现流程
1,创建一个统一数据返回处理类
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
}
2,ResponseBodyAdvice 中两个方法重写
2.1,supports方法重写
注意:该方法表示是否执行后续的beforeBodyWrite方法,该方法默认返回false,表示不进行后续的代码操作,也就是数据的加工处理,而返回true,才会执行后续的beforeBodyWrite方法。
2.2,beforeBodyWrite方法重写
注意:该方法实现返回数据格式的重写,让其返回统一的数据格式。
3,统一数据格式返回的实现代码
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {// 在这里可以根据条件判断是否需要对响应体进行处理// 这里直接返回 true 表示对所有请求的响应体进行处理return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {// 在这里对响应体进行处理,可以进行封装、格式化等操作HashMap<String,Object> result = new HashMap<>();result.put("code",200);result.put("msg","");result.put("data",body);// 返回处理后的数据return result;}
}
4,统一数据格式返回的实现注意
在统一数据处理时,如果你的统一数据处理方法返回类型是String
,返回时会出现报错的情况。
返回时具体的执行流程为:
- 方法返回的是
String
类型。 - 执行统一数据返回之前的处理:将
String
转换为HashMap
。 - 将
HashMap
转换为application/json
字符串返回给前端。
根据源代码的结论,数据转换的过程中会判断原始数据的类型,并选择相应的消息转换器来进行数据的转换。
- 如果原始数据的类型为
String
,则会使用StringHttpMessageConverter
进行类型转换。 - 如果原始数据不是
String
,则会使用其他合适的HttpMessageConverter
进行类型转换。
由于统一数据处理方法返回的是String
类型,在第三步中会选择StringHttpMessageConverter
进行转换。然而,StringHttpMessageConverter
无法直接将HashMap
对象直接转换为字符串,因此造成了报错。
注:StringHttpMessageConverter
默认情况下将只处理字符串类型的数据,故当使用StringHttpMessageConverter
时,无法直接将HashMap
对象直接转换为字符串,而HttpMessageConverter
可以将HashMap
转换为字符串。
为了解决这个问题,可以采取以下方法之一:
-
移除
StringHttpMessageConverter
:在Spring MVC的配置中,可以考虑移除StringHttpMessageConverter
,这样就不会再将String
类型的返回值视为需要进行JSON转换的对象。可以通过在配置类中重写configureMessageConverters
方法来实现:@Configuration public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);} }
注意:这样就会使用默认的
HttpMessageConverter
来处理返回值,而不会发生类型转换错误。 -
单独处理
String
类型返回值:在统一数据返回之前的处理过程中,可以检查返回值的类型。如果类型为String
,则直接返回字符串给前端,而不进行HashMap
到JSON的转换。可以通过自定义的统一数据返回处理类来实现:@ControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBodypublic Object handleException(Exception ex) {if (ex instanceof YourCustomException) {// 处理自定义异常逻辑return "Your custom error message";} else if (ex instanceof AnotherException) {// 处理另一个异常逻辑return "Another error message";} else {// 其他异常处理逻辑return "Generic error message";}} }
注意:在上述示例中,根据数据类型进行不同的处理,并直接返回相应的字符串给前端。
通过以上方法,可以解决统一数据处理方法返回类型为String
导致报错的问题,并根据需要进行特殊处理。请根据具体情况选择适合的解决方案。
结语
这就是本期博客的全部内容啦!如果有什么其他的问题无法自己解决,可以在评论区留言哦!
最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!