1. 程式人生 > 其它 >Spring: 資料繫結 & 型別轉換

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");

  }