解决SpringMVC使用@RequestBody注解报400错误的问题

一般使用@RequestBody接收的时候报400都是传入的json字符串和对应封装的对象不对应造成的

首先要注意

封装的对象中的字段类型有没有Date类型或者int等类型的,如果有的话,在set方法中统一将传入的参数要调整为String类型

在set方法中进行参数的转换

比如有一个Date类型的字段

 private Date startTime;

 public Date getStartTime() {
 return startTime;
 }
 public void setStartTime(String startTime) {
 // 这里根据你的时间格式选择
 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
 try {
  this.startTime = dateFormat.parse(startTime);
 } catch (ParseException e) {
  this.startTime = null;
 }
 }

这样写就可以了,不要将形参的类型写成Date类型,所以这里建议对实体类构建一个DTO,使用DTO进行封装

前台的ajax发送如下:

$.ajax({
 type : "POST",
 contentType : "application/json",
 url : xxxxx,// 请求路径
 data : JSON.stringify(data),// 将data的JSON对象转换为字符串{name:'value'}的格式
 success : function(msg) {
 },
 error : function() {
 }
});

后台的接受方法很简单

 @RequestMapping(value = "XXXXX.do", method = RequestMethod.POST)
 @ResponseBody
 public String saveInstCorNotice(@RequestBody EntityDTO entityDTO) {

 }

以前总被坑,这里记录一下!

补充知识:SpringMVC在拦截器中做权限控制,解决RequestBody获取问题

做接口的权限控制,接口请求结构是JSON串,比较为难的是@RequestBody的获取

网上的资料是先手动读出来,再使用自定义的封装将JSON串写回去

感觉有点麻烦,使用了新的思路

在拦截器中,拦截需要做权限验证的请求,使用下面的方式,将权限校验跳转到Controller层中做

String uri = request.getRequestURI();
request.setAttribute("referenceUrl", uri);
request.getRequestDispatcher(checkerUrl).forward(request, response);

url是用来校验权限的Controller路径

在Controller中可以使用@RequestBody注解拿到请求body,

之后可以使用获取到的body信息校验权限,

校验通过的,获取uri

再次通过如下方式,跳转到真正要请求的Controller层

request.getRequestDispatcher(uri).forward(request, response);

注意,这里会有拦截器死循环的问题,当然 因为@RequestBody只能读一次的特性,在第二次被拦截器拦截时就会因为请求Body为空抛异常。再当然 如果你不幸的设置了@RequestBody注解required属性为false,即允许为空 那么就真的陷入无限循环了

所以,这里我们要给request加一个标志,表明经过了该过滤器,一旦标志不为空则直接返回true 允许请求通过

if (null != flag) {
 return true;
}
/*
 *我想你不会将上面的代码写到拦截器后面的对吧
 *
 *一定要将上面的代码加到拦截器一开始的地方
 *也不要忘记 后续设置标志位的代码
*/

解决了上面的问题可能会有请求两次的问题,这是因为将权限校验跳转到Controller层后需要

return false

否则你会发现请求执行了两次,并且在第二次抛异常:writer已经调用过

当然,这里还有一个问题,那就是权限校验的Controller层已经读取了RequestBody,那么 真正的业务逻辑Controller层怎么获取呢?

在通过校验后,将获取到RequestBody放到Request的Attribute中

在业务逻辑Controller层使用@RequestAttribute注解获取

以上这篇解决SpringMVC使用@RequestBody注解报400错误的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Springmvc nginx实现动静分离过程详解

    在下自己整理 ,如有错误请指正 一般的nginx的 静态文件的项目是这么配置的 location ~ .*\.(js|css)?$ { root E:/Workspaces/Idea15/demo/web/WEB-INF; expires 1h; } 但是如果这样配置,系统是读取不到对应的文件的,因为springmvc本身的前端模板配置了访问静态资源 Handles 那如何使用nginx搭理访问,实现动静分离 搭建nginx代理 第一阶段,修改nginx.conf 文件 #location /

  • 浅谈springmvc 通过异常增强返回给客户端统一格式

    在springmvc开发中,我们经常遇到这样的问题:逻辑正常执行时返回客户端指定格式的数据,比如json,但是遇NullPointerException空指针异常,NoSuchMethodException调用的方法不存在异常,返回给客户端的是服务端异常堆栈信息,导致客户端不能正常解析数据:这明显不是我们想要的. 幸好从spring3.2提供的新注解@ControllerAdvice,从名字上可以看出大体意思是控制器增强.原理是使用AOP对Controller控制器进行增强(前置增强.后置增强.

  • 简单了解SpringMVC缓存对静态资源有什么影响

    我们知道在springmvc的配置中,可以添加缓存,但是缓存到底对静态资源有什么影响? 测试 没有添加缓存 <mvc:resources mapping="/image/**" location="/WEB-INF/"/> 添加了缓存 <mvc:resources mapping="/image/**" location="/WEB-INF/" cache-period="2592000"

  • SpringMVC如何把后台文件打印到前台

    实现效果如下: 代码为: @RequestMapping(value = "/tools/printContract") public void cell(HttpServletResponse response,HttpServletRequest request,String outName) { //根据outName获取到保存在服务器上的文件 String filePath = request.getSession().getServletContext().getRealPa

  • springmvc集成shiro登录失败处理操作

    一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authentication)和授权(Authorization);认证的作用是证明自身可以访问,一般是用户名加密码,授权的作用是谁可以访问哪些资源,通过开发者自己的用户角色权限系统来控制. shiro的会话管理和缓存管理不在本文范围内. 下面通过登录失败的处理流程来介绍springmvc与shiro的集成. 依赖项目

  • SpringMVC框架post提交数据库出现乱码解决方案

    使用Post添加数据到数据库出现方块乱码 解决方法,在web.xml里最前面添加过滤器,代码如下,放在最前面,因为有优先级,要首先拦截 <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-para

  • 解决SpringMVC使用@RequestBody注解报400错误的问题

    一般使用@RequestBody接收的时候报400都是传入的json字符串和对应封装的对象不对应造成的 首先要注意 封装的对象中的字段类型有没有Date类型或者int等类型的,如果有的话,在set方法中统一将传入的参数要调整为String类型 在set方法中进行参数的转换 比如有一个Date类型的字段 private Date startTime; public Date getStartTime() { return startTime; } public void setStartTime(

  • SpringBoot URL带有特殊字符([]/{}等),报400错误的解决

    目录 SpringBoot URL带有特殊字符([]/{}等),报400 解决办法有两种,转义和配置Tomcat 请求参数包含[]特殊符号的问题 当参数含有特殊符号 [] 报错400 SpringBoot URL带有特殊字符([]/{}等),报400 今天使用springboot开发接口,版本——2.1.3.RELEASE,需要接收json格式的字符串数据,json串中只有大括号时还正常,没有400,但是在传json数组时,带有中括号[],拦截器都不进就直接400,经过一阵排查,json格式等都

  • SpringMVC表单提交参数400错误解决方案

    SpringMVC下,提交表单报400错: description The request sent by the client was syntactically incorrect. 根据网上的总结,可能是因为如下几个问题引起的 1.参数指定问题 如果Controller中定义了参数,而表单内却没有定义该字段 @SuppressWarnings("deprecation") @RequestMapping("/hello.do") public String h

  • Spring框架 引入@Resource注解报空指针的解决

    目录 引入@Resource注解报空指针 解决方案 spring项目无法引入@Resource注解 问题 解决办法 引入@Resource注解报空指针 最近刚开始学习Spring框架,在使用注解@Resource时,无论怎么应用都报空指针,主要原因是JDK版本不支持, 解决方案 1.在maven配置文件pom.xml文件中引入依赖 org.apache.tomcat tomcat-annotations-api 9.0.13 2.更换本地JDK版本,最好1.8以上,注意1.9JDK版本不支持,有

  • 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    页面报错: 后台错误: Field error in object 'user' on field 'birthday': rejected value [2013-06-24]; codes [typeMismatch.user.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessag

  • 基于@RequestBody注解只能注入对象和map的解决

    目录 @RequestBody注解只能注入对象和map的问题 1.自定义一个适应于这种情况的注解@RequestJson 2.自定义RequestJsonHandlerMethodArgumentResolver 3.将上述配置应用到spring项目中 4.配置完成了,简单使用 @RequestBody注解的使用问题 先看一下@RequestBody的作用 个人总结: @RequestBody注解只能注入对象和map的问题 前后端分离开发模式下,前后端数据交互全部采用json,所以在后端在采用s

  • 亲测SpringBoot参数传递及@RequestBody注解---踩过的坑及解决

    目录 SpringBoot 参数传递及@RequestBody注解注意点 前台正确的js书写格式是 后台正确的Controller书写格式是 RequestBody 作为参数使用 为了证实这个想法,自己书写一个请求类 小结一下 SpringBoot 参数传递及@RequestBody注解注意点 前台正确的js书写格式是 //点击查询, 执行下面这个函数 $("#searchByCriteria").click(function () { //var paramdata = $(&quo

  • 解决springboot URL带有斜杠的转义字符百分之2F导致的400错误

    目录 springboot URL带有斜杠的转义字符百分之2F导致的400错误 原因 解决方式 springboot 1.x 2.x tomcat支持特殊字符 URL中有{}[]等报400 解决方案 sprintboot 1.x(1.5.21测试有效) springboot 2.x(2.1.3测试有效) 总结 后续 springboot URL带有斜杠的转义字符百分之2F导致的400错误 今天项目上出现一个问题,是前端的GET请求url中带有路径参数,这个参数中有/这个特殊字符,前端已经转移成了

  • SpringDataJpa的@Query注解报错的解决

    目录 SpringDataJpa @Query注解报错 SpringDataJpa @query注解使用原生代码报错 SpringDataJpa @Query注解报错 public interface TimeContentRepository extends JpaRepository<TimeContent,String> { @Query(value = "select id,user_id as userId,create_time as createTime "

  • Mybatis Mapper中多参数方法不使用@param注解报错的解决

    目录 问题描述 寻求解决方案 寻找原因 拓展延伸 在使用低版本的Mybatis的时候,Mapper中的方法如果有多个参数时需要使用@param注解,才能在对应xml的sql语句中使用参数名称获取传入方法的参数值,否则就会报错.本文结合自身在真实开发环境中使用IDEA开发时遇到的问题来共同探讨一下不使用@Param注解报错背后的原因以及解决方案. 问题描述 最近使用IDEA进行开发,项目使用SpringBoot+Mybatis3.4.6,同样的代码检出到本地IDEA后运行,在一个业务查询模块报错,

随机推荐