在前端提交一个日期类型数据时,SpringMVC会将其自动转化为java.sql.Date类型,但当这个日期类型的输入为空时,则SpringMVC则无法处理,控制台会报错,来看一个例子。
在第4章请求内容的基础上,追加了一个日期类型的数据(生日)
1.index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
新增用户<br>
账号:<input type="text" id="lname"><br>
密码:<input type="password" id="lpass"><br>
生日:<input type="date" id="birthday"><br>
<input type="button" value="提交" id="btn_regist">
<script type="text/javascript">
$(document).ready(function (){
$("#btn_regist").click(function (){
var lname = $("#lname").val();
var lpass = $("#lpass").val();
var birthday = $("#birthday").val();
$.ajax({
url: "addUser",
type: "POST",
data: {"lname":lname,"lpass":lpass,"birthday":birthday},
success: function(data){
alert(JSON.stringify(data));
}
});
});
});
</script>
</body>
</html>
2.UserPO类
public class UserPO {
private String lname;
private String lpass;
private Date birthday;
//set和get方法 略...
}
3.UserHandler类
@RestController
public class UserHandler {
@PostMapping("/addUser")
public String addUser(UserPO po) throws Exception {
System.out.println(po.getLname());
System.out.println(po.getLpass());
System.out.println(po.getBirthday());
return "success";
}
}
4.运行SpringBoot
在index.html网页上正常输入数据时
控制台可以正常接收数据
但是不输入生日数据时,点击提交时网页没有显示,打开“开发者调试工具”时,可见400错误
400错误
查看服务器控制台发现错误
image.png
很明显,错误提示是“无法将字符串''(空字符串)转换为日期类型”
解决这个问题的办法是设置SpringMVC的自定义类型转换器,在SpringMVC框架中可以通过配置文件进行转换器注册,SpringBoot取消了SpringMVC的配置文件,我们仅需要声明自定义转换器类被SpringBoot管理即可,即声明其为一个@Component类即可
步骤
1.编写自定义转换器类
新建com.neuedu.converter包,编写String2DateConverter类并实现org.springframework.core.convert.converter.Converter接口,并在convert方法中完成类型转换逻辑,同时使用@Component注册该类。
@Component
public class String2DateConverter implements Converter<String, Date>{
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Date convert(String str) {
if(str == null || str.isEmpty()) {
return null;
}
java.util.Date temp = null;
try {
temp = sdf.parse(str);
} catch (ParseException e) {
return null;
}
return (temp != null) ? new java.sql.Date(temp.getTime()) : null;
}
}
2.测试
不输入生日数据
控制台显示
显示正确
输入生日数据
控制台显示
显示正确
至此问题解决
网友评论