项目中需要对客户请求进行统一处理,便于服务方的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; }