SpringBoot結合ControllerAdvice和RequestBodyAdvice進行統一參數處理


項目中需要對客戶請求進行統一處理,便於服務方的Controller接收。

參考文章:

https://blog.csdn.net/pongandnoon/article/details/84555414

https://blog.csdn.net/yanmh007/article/details/88871705

 

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.demo.common.consts.Constant;
import com.demo.common.dto.BaseBodyRequest;
import com.demo.common.exception.ClientException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;

/**標版-請求報文處理*/
@Slf4j
@ControllerAdvice(basePackages = "com.demo.controller")//此處設置需要當前Advice執行的域 , 省略默認全局生效
public class StandardRequestBodyAdvice implements RequestBodyAdvice {
    
    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        Class<BaseBodyRequest> baseBodyRequestClazz = BaseBodyRequest.class;
    
        return false;
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                           Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
        JSONObject requestBody = JSON.parseObject(IOUtils.toString(inputMessage.getBody()));
        Method method=parameter.getMethod();
        log.info("{}.{}:{}",method.getDeclaringClass().getSimpleName(),method.getName(),requestBody.toJSONString());

        //獲取公共報文信息
        String sequenceNo = requestBody.getString(Constant.SEQUENCE_NO);
        String timestamp = requestBody.getString(Constant.TIMESTAMP);
        String channelId = requestBody.getString(Constant.CHANNEL_ID);
        JSONObject requestData = requestBody.getJSONObject(Constant.REQUEST_DATA);
        //對公共報文驗證
        if(StringUtils.isBlank(sequenceNo)) {
            throw new ClientException("sequenceNo不能為空");
        }
        if(StringUtils.isBlank(timestamp)) {
            throw new ClientException("timestamp不能為空");
        }
        if(StringUtils.isBlank(channelId)) {
            throw new ClientException("channelId不能為空");
        }
        requestBody.put(Constant.REQUEST_DATA,JSON.toJSONString(requestData));
        return new HttpInputMessage() {
            @Override
            public HttpHeaders getHeaders() {
                return inputMessage.getHeaders();
            }
            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream(requestBody.toJSONString().getBytes(StandardCharsets.UTF_8));
            }
        };
    }

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                Class<? extends HttpMessageConverter<?>> converterType) {
        return body;
    }

    @Override
    public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                  Class<? extends HttpMessageConverter<?>> converterType) {
        return body;
    }
}

入參示例:

{
"sequenceNo":"11111",
"timestamp":"2020-03-04 16:53:02",
"channelId":"1003",
"requestData":{"operator":"admin","supplierName":"銀行","productName": "存款","productStatus": "IN_SALE","sellStatus": "on","channelNames":["渠道1","渠道2"]}
}

 

Controller相關方法接收對象(@RequestBody BaseBodyRequest request):

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class BaseBodyRequest extends BaseDto {

    private static final long serialVersionUID = 941107305584826987L;

    private String sequenceNo;
    private String timestamp;
    private String channelId;
    private String requestData;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM