zoukankan      html  css  js  c++  java
  • 校验器

    @InitBinder亲测有效,网上很多资料都说了一半,或者没有说明白,

    我先简单的说下这个InitBinder是用来干嘛的,为什么要使用他,以及他出现的场景;

    通常来说前后台在做交互的时候,有一个form转换的过程就是把表单数据转换成我们的DTO,专门用来接收前台数据;

    这个时候就会有很多很东西值得我们去思考,也是通过自己摸索才发现出来的;

    直接上图,postMan;注意下面截图的地方,如果跟前台的交互是通过

    application/x-www-form-urlencoded,表单进行交互的,这个时候SpringMVC是不能帮你进行从string转换成Date的,更别说你的特殊形式的date,比如yyyy-MM-dd HH24-mm-ss等

    这个时候直接转就会出错!!如果没有InitBinder注解进行转换的话;

    脱离代码谈技术就是耍流氓!!!直接上代码

    这个controller中我写了两个方法,用来做校验

    package com.cloudwalk.shark.controller;
    
    import com.cloudwalk.shark.common.utils.ResponseData;
    import com.cloudwalk.shark.dto.validate.AdvertQueryForm;
    import com.cloudwalk.shark.editor.SharkDateEditor;
    import org.springframework.http.MediaType;
    import org.springframework.stereotype.Controller;
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.*;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Controller
    @RequestMapping(value = "/validate", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
    public class SharkValidationController {
    
       @InitBinder
    public void initBinder(WebDataBinder binder) { binder.setFieldDefaultPrefix("advert."); binder.registerCustomEditor(Date.class,"startDate",new SharkDateEditor()); } @PostMapping("/bean") @ResponseBody public ResponseData checkBeanIsValid(@Validated @RequestBody AdvertQueryForm advertQueryForm){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMM-dd"); System.out.println(simpleDateFormat.format(advertQueryForm.getStartDate())); return new ResponseData(true,"2","3",advertQueryForm); } @PostMapping("/beanForm") @ResponseBody public ResponseData checkBeanIsValidFormUrlEncoded(AdvertQueryForm advertQueryForm){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMM-dd"); System.out.println(simpleDateFormat.format(advertQueryForm.getStartDate())); return new ResponseData(true,"2","3",advertQueryForm); } }

     我们的startDate是Date类型的,希望SpringMVC直接帮我们从String转换成Date,

    而不是我们自己在进行转换

    package com.cloudwalk.shark.dto.validate;
    
    
    import java.util.Date;
    
    public class AdvertQueryForm {
        private String merchantName;
    
        private String merchantCode;
    
        private String clientCode;
    
        private String id;
    
        private Date startDate;
    
        public String getMerchantName() {
            return merchantName;
        }
    
        public void setMerchantName(String merchantName) {
            this.merchantName = merchantName;
        }
    
        public String getMerchantCode() {
            return merchantCode;
        }
    
        public void setMerchantCode(String merchantCode) {
            this.merchantCode = merchantCode;
        }
    
        public String getClientCode() {
            return clientCode;
        }
    
        public void setClientCode(String clientCode) {
            this.clientCode = clientCode;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public Date getStartDate() {
            return startDate;
        }
    
        public void setStartDate(Date startDate) {
            this.startDate = startDate;
        }
    }

    同时initBinder还可以帮我们简化类型转换,比如我们的参数里面包含advert这种父名(前台代码在写的时候很容易有这种层次)

    我们也想通过SpringMvc自动帮我们进行参数接收

    binder.setFieldDefaultPrefix("advert.");
    这行代码就能省去我们很多事情;直接上图

    通过这种方式我们也能获取前台的参数;
    而通过[{"key":"Content-Type","name":"Content-Type","value":"application/json","description":"","type":"text"}]

    这种方式你的initBinder是不会生效的,这个在Form里面你可以写各种各样的注解去验证,jsonField等,不需要通过InitBinder去实现;

    而且这种方式SpringMVC 就直接能帮你把关键的key转换成相应的Date!!

    给大家看下我们自定义的Editor

    package com.cloudwalk.shark.editor;
    
    import java.beans.PropertyEditorSupport;
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class SharkDateEditor extends PropertyEditorSupport {
        @Override
        public String getAsText() {
            //获取属性值
            Date date = (Date) getValue();
            DateFormat dateFormat = new SimpleDateFormat("yyyyMM--dd");
            String str = dateFormat.format(date);
            String mydate = str.substring(0, 4) + str.substring(4, 6) + "--" + str.substring(8, 10);
            System.out.println(mydate);
            return mydate;
        }
    
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            DateFormat dateFormat = new SimpleDateFormat("yyyyMM--dd");
            try {
                System.out.println(dateFormat.parse(text));
                //设置属性值
                setValue(dateFormat.parse(text));
            } catch (ParseException e) {
                System.out.println("ParseException....................");
            }
        }
    }

    比如我们可以自定义解析前台传来的特殊格式的日期!

    
    
     
  • 相关阅读:
    增量更新代码步骤记录
    软件缺陷管理基本流程
    数据库语言(三):MySQL、PostgreSQL、JDBC
    eclipse的使用
    数据库语言(二):SQL语法实例整理
    windows下MySql没有setup.exe时的安装方法
    数学:完全独立于实际场景的情况下定义的概念,可以正确的描述世界
    数学语言和程序语言的对比:面向过程与面向集合&命题
    iOS开发之IMP和SEL(方法和类的反射)
    iOS之UIButton的normal和selected状态切换
  • 原文地址:https://www.cnblogs.com/longxok/p/10925255.html
Copyright © 2011-2022 走看看