获取post请求Body参数

使用JSON接收前端参数时, param参数可以获取, 但body中的json数据 则需要从reqeust.getInputStream中获取JSON内容, 但是由于流只能读取一次, 所以会导致后续SpringMVC解析参数异常。

网上找到一种解决方法: 用HttpRequestWrapper重新封装Reqeust, 使打印日志后SpringMVC能正常解析HttpReqeust。这种方法比较麻烦, 这里不去研究。(这个方法我以前试过,实现也可以,但可能会引起一些奇怪的错误,毕竟实质上是用拷贝的流来实现业务,可能跟最初的流有不一样的地方)

这里主要说说Spring提供的较好的解决方案:

可以通过自定义RequestBodyAdvisor、ResponseBodyAdvisor来实现日志输出。

  • RequestBodyAdvisor可以获取到解析后的Controller方法参数对象。
  • ResponseBodyAdvisor可以获取到Controller方法返回值对象。

然后将他们注册到requestMappingHandlerAdapter:

前提:

①使用springMvc

②controller层方法上使用@RequestBody注解修饰

@Configuration
@Slf4j
public class WebMvcSupportConfig extends WebMvcConfigurationSupport {
    @Override
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter adapter = super.requestMappingHandlerAdapter();
        adapter.setRequestBodyAdvice(Lists.newArrayList(new CustomerRequestBodyAdvisor()));
        return adapter;
    }
}
CustomerRequestBodyAdvisor实现样例:
public class CustomerRequestBodyAdvisor extends RequestBodyAdviceAdapter {


    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        return methodParameter.getParameterAnnotation(RequestBody.class) != null;
    }

    /**
     * 拦截请求的body入参,并打印
     * 只支持RequestBody注解修饰的Controller方法
     */
    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
        Method method = parameter.getMethod();

        // 参数对象转JSON字符串
        String jsonBody;
        if (StringHttpMessageConverter.class.isAssignableFrom(converterType)) {
            jsonBody = body.toString();
        } else {
            jsonBody = JSON.toJSONString(body);
        }
        // 自定义日志输出
        log.info("前端Body入参={}", jsonBody);
        return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType);
    }
}

另外,还可以获取@ResponseBody的数据, 不过我暂时没遇到应用场景, 实现方式可参考:

https://www.jb51.net/article/155828.htm

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值