SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法
使用SpringMVC开发的时候,页面如果有日期格式的数据,后台接受也是java.util.Date,则报告400错误 。下面是解决方案的演示示例:
这个是实体类,里面createDate就是java.util.Date类型
1 import java.util.Date; 2 3 public class User { 4 5 private int userId; 6 private String userName; 7 private Date createDate; 8 9 public User() {} 10 11 public User(int userId, String userName, Date createDate) { 12 super(); 13 this.userId = userId; 14 this.userName = userName; 15 this.createDate = createDate; 16 } 17 18 public User(String userName, Date createDate) { 19 super(); 20 this.userName = userName; 21 this.createDate = createDate; 22 } 23 24 public int getUserId() { 25 return userId; 26 } 27 28 public void setUserId(int userId) { 29 this.userId = userId; 30 } 31 32 public String getUserName() { 33 return userName; 34 } 35 36 public void setUserName(String userName) { 37 this.userName = userName; 38 } 39 40 public Date getCreateDate() { 41 return createDate; 42 } 43 44 public void setCreateDate(Date createDate) { 45 this.createDate = createDate; 46 } 47 48 @Override 49 public String toString() { 50 return "User [createDate=" + createDate + ", userId=" + userId 51 + ", userName=" + userName + "]"; 52 } 53 }
页面代码
1 <form action="regUser" method="post"> 2 userName:<input type="text" name="userName"/><br> 3 createDate:<input type="text" name="createDate"/><br> 4 double类型:<input type="text" name="dd"/><br> 5 <input type="submit" value="注册"> 6 </form>
因为对于原生基本类型的form表单绑定,会出错。需要指定具体的类型编辑器。用法如下:首先在BaseController中增加方法initBinder,并使用注解@InitBinder标注,那么spring mvc在绑定表单之前,都会先注册这些编辑器。剩下的控制器都继承该类。CustomDateEditor spring自己已经提供了。代码如下:
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 4 import org.springframework.beans.propertyeditors.CustomDateEditor; 5 import org.springframework.stereotype.Controller; 6 import org.springframework.web.bind.WebDataBinder; 7 import org.springframework.web.bind.annotation.InitBinder; 8 9 import sun.beans.editors.DoubleEditor; 10 import sun.beans.editors.FloatEditor; 11 import sun.beans.editors.IntEditor; 12 import sun.beans.editors.LongEditor; 13 14 @Controller 15 public class BaseController { 16 17 @InitBinder 18 public void initBinder(WebDataBinder binder) { 19 20 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); 21 binder.registerCustomEditor(int.class, new IntEditor()); 22 binder.registerCustomEditor(long.class, new LongEditor()); 23 binder.registerCustomEditor(double.class, new DoubleEditor()); 24 binder.registerCustomEditor(float.class, new FloatEditor()); 25 } 26 27 28 }
上面的代码不仅仅有日期格式的编辑器,还有基础类型的编辑器,这样就解决了SpringMVC中controller方法接受参数的时候,基础类型报错的问题了。
下面是测试用代码,继承BaseController之后就可以直接运行了。接受的参数有实体类和基础类型。
1 import org.springframework.stereotype.Controller; 2 import org.springframework.web.bind.annotation.RequestMapping; 3 4 import com.kickstarter.entity.User; 5 6 @Controller("userController") 7 public class UserController extends BaseController{ 8 9 @RequestMapping(value="regUser") 10 public String dateTest(User user , double dd){ 11 12 System.out.println( user.toString() ); 13 System.out.println( dd ); 14 return "index"; 15 } 16 }
以上,问题解决。然后我们切换第二种方式,删除 BaseController 这个类,直接在User实体类中的 createDate字段上加上注解 , 注意第10行代码:
1 import java.util.Date; 2 3 import org.springframework.format.annotation.DateTimeFormat; 4 5 public class User { 6 7 private int userId; 8 private String userName; 9 10 @DateTimeFormat(pattern="yyyy-MM-dd") 11 private Date createDate; 12 13 public User() {} 14 15 public User(int userId, String userName, Date createDate) { 16 super(); 17 this.userId = userId; 18 this.userName = userName; 19 this.createDate = createDate; 20 } 21 22 public User(String userName, Date createDate) { 23 super(); 24 this.userName = userName; 25 this.createDate = createDate; 26 } 27 28 public int getUserId() { 29 return userId; 30 } 31 32 public void setUserId(int userId) { 33 this.userId = userId; 34 } 35 36 public String getUserName() { 37 return userName; 38 } 39 40 public void setUserName(String userName) { 41 this.userName = userName; 42 } 43 44 public Date getCreateDate() { 45 return createDate; 46 } 47 48 public void setCreateDate(Date createDate) { 49 this.createDate = createDate; 50 } 51 52 @Override 53 public String toString() { 54 return "User [createDate=" + createDate + ", userId=" + userId 55 + ", userName=" + userName + "]"; 56 } 57 }
这样也可以解决日期格式报400问题。而且不管页面是否有数据都可以正常使用。
转自 SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法
作者:欢醉
公众号【一个码农的日常】 技术群:319931204 1号群: 437802986 2号群: 340250479
出处:http://zhangs1986.cnblogs.com/
码云:https://gitee.com/huanzui
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
公众号【一个码农的日常】 技术群:319931204 1号群: 437802986 2号群: 340250479
出处:http://zhangs1986.cnblogs.com/
码云:https://gitee.com/huanzui
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?