解析springboot包裝controller返回值問(wèn)題
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)
定義類(lèi)ResponseAdvisor實(shí)現(xiàn)ResponseBodyAdvice接口,重寫(xiě)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類(lèi)型:
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/test")
public Test test(){
return new Test("test", 10);
}
}
執(zhí)行結(jié)果如下:

3.2 測(cè)試返回String類(lèi)型:
@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類(lèi)的返回值沒(méi)有String類(lèi)型的,僅有上面這個(gè)類(lèi)就夠了。如果有String類(lèi)型的返回值,就有可能遇到類(lèi)型不匹配的問(wèn)題。HttpMessageConverter是根據(jù)Controller的原始返回值類(lèi)型進(jìn)行處理的,而我們?cè)赗esponseAdvisor中改變了返回值的類(lèi)型。如果HttpMessageConverter處理的目標(biāo)類(lèi)型是Object還好說(shuō),如果是其它類(lèi)型就會(huì)出現(xiàn)問(wèn)題,其中最容易出現(xiàn)問(wèn)題的就是String類(lèi)型,因?yàn)樵谒械腍ttpMessageConverter實(shí)例集合中,StringHttpMessageConverter要比其它的Converter排得靠前一些。我們需要嘗試將處理Object類(lèi)型的HttpMessageConverter放得靠前一些,這可以在一個(gè)Configuration類(lèi)中完成:
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類(lèi)型,返回結(jié)果如下:

?3.5 測(cè)試返回其他基本數(shù)據(jù)類(lèi)型,也都沒(méi)問(wèn)題。
下篇寫(xiě)全局業(yè)務(wù)異常封裝,加油!
到此這篇關(guān)于springboot包裝controller返回值的文章就介紹到這了,更多相關(guān)springboot包裝controller返回值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java的幾個(gè)重要版本_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
jdk8 將在2014年3月份發(fā)布,迄今為止,可能是最大更新的java版本,也是令人期待的一個(gè)版本,在Java中引入閉包概念對(duì)Java程序開(kāi)發(fā)方法的影響甚至?xí)笥贘ava5中引入的泛型特征對(duì)編程方式帶來(lái)的影響2017-06-06
解決Error:(1,?1)?java:?非法字符:?'\ufeff'問(wèn)題
這篇文章主要介紹了解決Error:(1,?1)?java:?非法字符:?'\ufeff'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
HttpUtils 發(fā)送http請(qǐng)求工具類(lèi)(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇HttpUtils 發(fā)送http請(qǐng)求工具類(lèi)(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
JetBrains?發(fā)布下一代?IDE無(wú)比輕量幾秒就能啟動(dòng)干活
雖然?JetBrains?公司說(shuō)?Fleet?的定位和目標(biāo)并不是代替其他?IDE,但個(gè)人覺(jué)得,?如果?Fleet?火起來(lái)了,其他?IDE?就會(huì)黯然失色,特別是多語(yǔ)言開(kāi)發(fā)者,誰(shuí)愿意裝多個(gè)?IDE?呢?到時(shí)候,可能?JetBrains?以后的所有?IDE?要一統(tǒng)江湖了2021-12-12
詳解Lombok安裝及Spring Boot集成Lombok
這篇文章主要介紹了詳解Lombok安裝及Spring Boot集成Lombok,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03

