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