美文网首页
第5章 自定义类型转换器

第5章 自定义类型转换器

作者: yangsg | 来源:发表于2019-01-21 10:49 被阅读0次

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

    测试成功
    控制台显示
    显示正确

    输入生日数据

    测试成功
    控制台显示
    显示正确

    至此问题解决

    相关文章

      网友评论

          本文标题:第5章 自定义类型转换器

          本文链接:https://www.haomeiwen.com/subject/ljbqjqtx.html