我是靠谱客的博主 拼搏火龙果,这篇文章主要介绍解析springboot包装controller返回值问题,现在分享给大家,希望可以做个参考。

1、springboot项目统一包装返回值,通常返回结果包含code、message、data,结构如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class ResponseResult<T> { private int code; private String message; private T data; public ResponseResult(T data) { this.data = data; this.code = 0; this.message = "success"; } }

2、基于ControllerAdvice和HttpMessageConverter实现

定义类ResponseAdvisor实现ResponseBodyAdvice接口,重写supports跟beforeBodyWrite方法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; @ControllerAdvice public class ResponseAdvisor implements ResponseBodyAdvice<Object> { @Override public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) { return true; } @Override public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { if(o instanceof ResponseResult){ return o; } return new ResponseResult<>(o); }

3、接口测试

3.1 测试返回Object类型:

复制代码
1
2
3
4
5
6
7
8
9
@RestController @RequestMapping("/test") public class TestController { @GetMapping("/test") public Test test(){ return new Test("test", 10); } }

执行结果如下:

3.2 测试返回String类型:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController @RequestMapping("/test") public class TestController { @GetMapping("/test") public Test test(){ return new Test("test", 10); } @GetMapping("/test1") public String test1(){ return "test"; } }

执行结果如下:

3.3 如果Controller类的返回值没有String类型的,仅有上面这个类就够了。如果有String类型的返回值,就有可能遇到类型不匹配的问题。HttpMessageConverter是根据Controller的原始返回值类型进行处理的,而我们在ResponseAdvisor中改变了返回值的类型。如果HttpMessageConverter处理的目标类型是Object还好说,如果是其它类型就会出现问题,其中最容易出现问题的就是String类型,因为在所有的HttpMessageConverter实例集合中,StringHttpMessageConverter要比其它的Converter排得靠前一些。我们需要尝试将处理Object类型的HttpMessageConverter放得靠前一些,这可以在一个Configuration类中完成:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration; import java.util.List; @Configuration public class ResponseResultConfig extends DelegatingWebMvcConfiguration { @Override protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(0, new MappingJackson2HttpMessageConverter()); super.configureMessageConverters(converters); } }

3.4 重启服务后再次测试返回String类型,返回结果如下:

 3.5 测试返回其他基本数据类型,也都没问题。

下篇写全局业务异常封装,加油!

到此这篇关于springboot包装controller返回值的文章就介绍到这了,更多相关springboot包装controller返回值内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!

最后

以上就是拼搏火龙果最近收集整理的关于解析springboot包装controller返回值问题的全部内容,更多相关解析springboot包装controller返回值问题内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(362)

评论列表共有 0 条评论

立即
投稿
返回
顶部