SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法
时间:2022-04-23
本文章向大家介绍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问题。而且不管页面是否有数据都可以正常使用。
- 生产环境sql语句调优实战第二篇(r2第38天)
- 生产环境sql语句调优实战第三篇(r2笔记38天)
- 简单易学的机器学习算法——K-Means算法
- 通过shell脚本定位性能sql和生成报告(r2笔记37天)
- VXFS启用异步IO导致的严重问题(r2笔记56天)
- 通过sql语句分析足彩(r2笔记55天)
- 关于验证表中有无数据的方法比较(r2笔记54天)
- 海量数据迁移之分区并行抽取(r2笔记53天)
- 海量数据迁移之外部表切分(r2笔记52天)
- 怎样突破表名30个字符的限制(r2笔记51天)
- C/C++——排序
- 关于move tablespace的问题总结(r2笔记50天)
- 一些极度危险的linux命令(r2笔记49天)
- 挑战数据结构与算法面试题——80题全解析(一)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 测试面试题集-Linux常用命令
- 「真香警告」鱼头手摸手教你在小程序里用composition-api
- 【技术文】SSL握手中的几个密码
- 分布式监控系统SkyWalking
- 文献笔记二十九:银合欢(Leucaena trichandra)线粒体基因组
- Docker Swarm群集配置实战——第一战
- 文献笔记五十:vcf2poptree根据vcf文件构建进化树的网页工具
- typescript基础篇(6):泛型
- Flutter 初学者必读的高级布局规则
- Docker Swarm群集配置实战——第二战
- Python 基础(五):序列
- OpenCV黑魔法之隐身衣 | 附源码
- SQL 统计用户留存
- 常用的前端JQ插件
- 面向对象编程(设计模式)需要遵循的 6 个基本原则