本篇文章小编给大家分享一下springmvc获取@Requestbody转换的异常处理方式代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
1、引入问题
使用spring 自动的@RequestBody,可以很方便的将参数转换成对象,然而在自动转换中出现如果出现异常,会默认直接发送HTTP异常代码和错误信息,如何才能自定义自己的异常呢。
2、解决方案
解答问题的方式有可以有很多,一种通用的解答方式是使用@ExceptionHandler
2.1 例如传递的请求体为JSON时
Spring 可以自动封装成一个Map
@PostMapping(value = "/check",consumes = "application/json") public ApiResult check(@RequestBody MapparamBody) { // ......... }
2.2 如果请求体中是一个非正常的JSON格式
那么会出现异常,可以看到是com.fasterxml.jackson.core.JsonParseException类型的(jackson是spring boot默认的json解析库)
14:29:40.891 [http-nio-9091-exec-3] WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver - Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized character escape '[' (code 91); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape '[' (code 91)
返回给前端的可能如下格式的提示,默认的格式不是太好处理
{ "timestamp": 1551680980906, "status": 400, "error": "Bad Request", "message": "JSON parse error: Unrecognized character escape '[' (code 91); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape '[' (code 91)n at [Source: (PushbackInputStream); line: 66, column: 29]", "path": "/check" }
2.3 自定义错误格式输出
@ExceptionHandler(value = JsonParseException.class) public @ResponseBody ApiResult exceptionHandler(JsonParseException e){ return new ApiResult(500, "调用接口异常,解析请求体JSON格式错误", null); }
2.4 如果还想获取传递的请求体参数呢
因为请求体是流的形式,只能读一次,在解析请求体后,流已经关闭了。再在上面的代码中添加request获取请求体,会得到一个已经关闭的流。下面是结合网上的例子和实践过的方案
2.4.1 定义一个filter,缓存请求
/** * * @author Bob.chen * @date 2019年3月4日-下午2:10:01 * @desc 包装下请求,是请求体可以在@ExceptionHandler中使用 */ @Component public class RequestWrapperFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { filterChain.doFilter(new ContentCachingRequestWrapper(httpServletRequest), httpServletResponse); } }
2.4.2 在自定义错误格式中使用缓存的请求
@ExceptionHandler(value = JsonParseException.class) public @ResponseBody ApiResult exceptionHandler(JsonParseException e, ServletRequest request) { if (request != null && request instanceof ContentCachingRequestWrapper) { ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request; LOG.warn("BAD_REQUEST_BODY:{}", StringUtils.toEncodedString(wrapper.getContentAsByteArray(), Charset.forName(wrapper.getCharacterEncoding()))); } return new ApiResult(500, "调用接口异常,解析请求体JSON格式错误", null); }
@RequestBody注解的一些注意事项
1.@RequestBody注解用来获取请求体中的数据
直接使用得到的是key=value&key=value…结构的数据,因此get方式不适用(get方式下@RequestBody获取不到任何数据)。
例:
public void test1(@RequestBody String body){ system.out.println(body); }
输出结果:
username=hehe&age=20
2.使用@RequestBody注解后
可以在方法中创建一个集合对象,前端提交的集合数据可以直接被注入到方法的集合对象中,而不需要创建一个pojo对象进行集合的封装。
3.如果想要将前端提交的json字符串自动封装到一个对象中
需要导入jackson的相关jar包,并使用@RequestBody注解。
注:springmvc默认使用MappingJacksonHttpMessageConverter对json数据进行转换。
4.使用@RequestBody
前后端参数要匹配个数不能少,字段名字要一样。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整