博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
校验器
阅读量:4327 次
发布时间:2019-06-06

本文共 4568 字,大约阅读时间需要 15 分钟。

@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....................");        }    }}

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

 
 

转载于:https://www.cnblogs.com/longxok/p/10925255.html

你可能感兴趣的文章
P3384 【模板】树链剖分
查看>>
Thrift源码分析(二)-- 协议和编解码
查看>>
考勤系统之计算工作小时数
查看>>
4.1 分解条件式
查看>>
Equivalent Strings
查看>>
flume handler
查看>>
收藏其他博客园主写的代码,学习加自用。先表示感谢!!!
查看>>
H5 表单标签
查看>>
su 与 su - 区别
查看>>
C语言编程-9_4 字符统计
查看>>
在webconfig中写好连接后,在程序中如何调用?
查看>>
限制用户不能删除SharePoint列表中的条目(项目)
查看>>
【Linux网络编程】使用GDB调试程序
查看>>
feign调用spring clound eureka 注册中心服务
查看>>
ZT:Linux上安装JDK,最准确
查看>>
LimeJS指南3
查看>>
关于C++ const成员的一些细节
查看>>
《代码大全》学习摘要(五)软件构建中的设计(下)
查看>>
C#检测驱动是否安装的问题
查看>>
web-4. 装饰页面的图像
查看>>