Spring: 資料繫結 & 型別轉換
阿新 • • 發佈:2022-06-01
@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; publicMyDateFormatter(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"); }