第5章 自定义类型转换器

在前端提交一个日期类型数据时,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.测试
不输入生日数据

测试成功

控制台显示
显示正确

输入生日数据

测试成功

控制台显示
显示正确

至此问题解决

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容