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"); }
分类:
Spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-06-01 miscellanea