001package run.iget.framework.common.handler;
002
003import org.springframework.core.MethodParameter;
004import org.springframework.http.MediaType;
005import org.springframework.http.converter.HttpMessageConverter;
006import org.springframework.http.server.ServerHttpRequest;
007import org.springframework.http.server.ServerHttpResponse;
008import org.springframework.web.bind.annotation.RestControllerAdvice;
009import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
010
011import com.alibaba.fastjson.JSON;
012
013import lombok.extern.slf4j.Slf4j;
014import run.iget.framework.common.resp.ResultResp;
015
016/**
017 * 代码千万行,注释第一行,注释不规范,迭代两行泪
018 * ---------------类描述-----------------
019 * 将RestController方法的返回值都包装成统一的格式
020 * ---------------类描述-----------------
021 * @author 大周
022 * @date 2022/11/11 21:47
023 */
024@Slf4j
025@RestControllerAdvice
026public class RestControllerAdviceHandler implements ResponseBodyAdvice<Object> {
027
028    @Override
029    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
030        return true;
031    }
032
033    @Override
034    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType mediaType,
035                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
036                                  ServerHttpRequest request, ServerHttpResponse serverHttpResponse) {
037        if (body instanceof ResultResp) {
038            return body;
039        }
040        if (mediaType != MediaType.APPLICATION_JSON) {
041            serverHttpResponse.getHeaders().setContentType(MediaType.APPLICATION_JSON);
042        }
043        ResultResp responseEntity = ResultResp.ok(body);
044        // 如果是String类型,需要返回string对象
045        if (body instanceof String) {
046            return JSON.toJSONString(responseEntity);
047        }
048        return responseEntity;
049    }
050}