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 @ 2022-06-01 16:31  ascertain  阅读(76)  评论(0)    收藏  举报