Spring: 数据绑定 & 类型转换

 

@InitBinder

复制代码
package io.jot.memento;


import org.springframework.format.Formatter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class MyDateFormatter implements Formatter<Date>{
  private final String desc;

  public MyDateFormatter(String desc){
    this.desc = desc;
  }

  @Override
  public Date parse(String text, Locale locale) throws ParseException{
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy|MM|dd");
    return simpleDateFormat.parse(text);
  }

  @Override
  public String print(Date object, Locale locale){
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy|MM|dd");
    return simpleDateFormat.format(object);
  }
}
复制代码
复制代码
package io.jot.memento;


import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.bind.ServletRequestParameterPropertyValues;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.method.support.InvocableHandlerMethod;
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestDataBinderFactory;

import java.util.Date;
import java.util.List;

public class Venal{
  public static void main(String[] args) throws Exception{
    MockHttpServletRequest servletRequest = new MockHttpServletRequest();
    servletRequest.setParameter("birthday", "1999|05|06");
    servletRequest.setParameter("address.name", "etymology");

    User user = new User();
    // ServletRequestDataBinderFactory dataBinderFactory = new ServletRequestDataBinderFactory(null, null);
    // WebDataBinder dataBinderFactoryBinder = dataBinderFactory.createBinder(new ServletWebRequest(servletRequest), user, "user");
    // dataBinderFactoryBinder.bind(new ServletRequestParameterPropertyValues(servletRequest));
    InvocableHandlerMethod handlerMethod = new InvocableHandlerMethod(new MyController(), MyController.class.getMethod("initBinder", WebDataBinder.class));
    ServletRequestDataBinderFactory servletRequestDataBinderFactory = new ServletRequestDataBinderFactory(List.of(handlerMethod), null);
    WebDataBinder dataBinder = servletRequestDataBinderFactory.createBinder(new ServletWebRequest(servletRequest), user, "user");
    dataBinder.bind(new ServletRequestParameterPropertyValues(servletRequest));

    System.out.println("\033[37;7m>>>>>> " + user + " <<<<<<\033[0m");

  }

  static class MyController{
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
      webDataBinder.addCustomFormatter(new MyDateFormatter("@InitBinder"));
    }

  }

  public static class User{
    @DateTimeFormat(pattern = "yyyy|MM|dd")
    private Date birthday;
    private Address address;

    public Address getAddress(){
      return address;
    }

    public void setAddress(Address address){
      this.address = address;
    }

    public Date getBirthday(){
      return birthday;
    }

    public void setBirthday(Date birthday){
      this.birthday = birthday;
    }

    @Override
    public String toString(){
      return "User{" +
        "birthday=" + birthday +
        ", address=" + address +
        '}';
    }
  }

  public static class Address{
    private String name;

    public String getName(){
      return name;
    }

    public void setName(String name){
      this.name = name;
    }

    @Override
    public String toString(){
      return "Address{" +
        "name='" + name + '\'' +
        '}';
    }
  }
}
复制代码

 

@ConversionService

复制代码
  public static void main(String[] args) throws Exception{
    MockHttpServletRequest servletRequest = new MockHttpServletRequest();
    servletRequest.setParameter("birthday", "1999|05|06");
    servletRequest.setParameter("address.name", "etymology");

    User user = new User();
    FormattingConversionService conversionService = new FormattingConversionService();
    conversionService.addFormatter(new MyDateFormatter("conversionService"));
    ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
    initializer.setConversionService(conversionService);

    ServletRequestDataBinderFactory dataBinderFactory = new ServletRequestDataBinderFactory(null, initializer);
    WebDataBinder dataBinder = dataBinderFactory.createBinder(new ServletWebRequest(servletRequest), user, "user");
    dataBinder.bind(new ServletRequestParameterPropertyValues(servletRequest));

    System.out.println("\033[37;7m>>>>>> " + user + " <<<<<<\033[0m");

  }
复制代码

 

ApplicationConversionService & DefaultFormattingConversionService

复制代码
  public static void main(String[] args) throws Exception{
    MockHttpServletRequest servletRequest = new MockHttpServletRequest();
    servletRequest.setParameter("birthday", "1999|05|06");
    servletRequest.setParameter("address.name", "etymology");

    User user = new User();
    // DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();  // 配置@DateTimeFormat
    ApplicationConversionService conversionService = new ApplicationConversionService();  // Springboot使用
    // conversionService.addFormatter(new MyDateFormatter("conversionService"));
    ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
    initializer.setConversionService(conversionService);

    ServletRequestDataBinderFactory dataBinderFactory = new ServletRequestDataBinderFactory(null, initializer);
    WebDataBinder dataBinder = dataBinderFactory.createBinder(new ServletWebRequest(servletRequest), user, "user");
    dataBinder.bind(new ServletRequestParameterPropertyValues(servletRequest));

    System.out.println("\033[37;7m>>>>>> " + user + " <<<<<<\033[0m");

  }
复制代码

 

posted @   ascertain  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-06-01 miscellanea
点击右上角即可分享
微信分享提示