解析springboot包裝controller返回值問題
1、springboot項(xiàng)目統(tǒng)一包裝返回值,通常返回結(jié)果包含code、message、data,結(jié)構(gòu)如下
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實(shí)現(xiàn)
定義類ResponseAdvisor實(shí)現(xiàn)ResponseBodyAdvice接口,重寫supports跟beforeBodyWrite方法
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、接口測(cè)試
3.1 測(cè)試返回Object類型:
@RestController @RequestMapping("/test") public class TestController { @GetMapping("/test") public Test test(){ return new Test("test", 10); } }
執(zhí)行結(jié)果如下:
3.2 測(cè)試返回String類型:
@RestController @RequestMapping("/test") public class TestController { @GetMapping("/test") public Test test(){ return new Test("test", 10); } @GetMapping("/test1") public String test1(){ return "test"; } }
執(zhí)行結(jié)果如下:
3.3 如果Controller類的返回值沒有String類型的,僅有上面這個(gè)類就夠了。如果有String類型的返回值,就有可能遇到類型不匹配的問題。HttpMessageConverter是根據(jù)Controller的原始返回值類型進(jìn)行處理的,而我們?cè)赗esponseAdvisor中改變了返回值的類型。如果HttpMessageConverter處理的目標(biāo)類型是Object還好說,如果是其它類型就會(huì)出現(xiàn)問題,其中最容易出現(xiàn)問題的就是String類型,因?yàn)樵谒械腍ttpMessageConverter實(shí)例集合中,StringHttpMessageConverter要比其它的Converter排得靠前一些。我們需要嘗試將處理Object類型的HttpMessageConverter放得靠前一些,這可以在一個(gè)Configuration類中完成:
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?重啟服務(wù)后再次測(cè)試返回String類型,返回結(jié)果如下:
?3.5 測(cè)試返回其他基本數(shù)據(jù)類型,也都沒問題。
下篇寫全局業(yè)務(wù)異常封裝,加油!
到此這篇關(guān)于springboot包裝controller返回值的文章就介紹到這了,更多相關(guān)springboot包裝controller返回值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)flappy Bird小游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)flappy Bird小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Java8中Optional類型和Kotlin中可空類型的使用對(duì)比
這篇文章主要給大家介紹了關(guān)于Java8中Optional類型和Kotlin中可空類型的使用對(duì)比,文中通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解
這篇文章主要介紹了Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-09-09VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn)
這篇文章主要介紹了VSCode+Gradle搭建Java開發(fā)環(huán)境實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java Web開發(fā)防止多用戶重復(fù)登錄的完美解決方案
在web項(xiàng)目開發(fā)中,很多情況下都可以讓同一個(gè)賬號(hào)信息在不同的登錄入口登錄很多次,這樣子做的不是很完善。一般解決這種情況有兩種解決方案,小編呢主要以第二種方式給大家介紹具體的實(shí)現(xiàn)方法,對(duì)java web 防止多用戶重復(fù)登錄的解決方案感興趣的朋友一起看看吧2016-11-11為什么ConcurrentHashMap的key value不能為null,map可以?
這篇文章主要介紹了為什么ConcurrentHashMap的key value不能為null,map可以呢?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01