校验器

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

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


 
posted @ 2019-05-26 10:15  龙X  阅读(226)  评论(0编辑  收藏  举报