上篇我们学习了《38-Spring MVC的Interceptor》,本篇我们学习Spring MVC Formatter配置和使用。
3.4 Formatter
org.springframework.format.Formatter是Spring提供用来替代PropertyEditor的,PropertyEditor不是线程安全的,每个web请求都会通过WebDataBinder注册创建新的PropertyEditor实例,而Formatter是线程安全的。
我们可以定义一个类似于PersonEditor的PersonFormmater,它实现Formatter接口:
public class PersonFormatter implements Formatter<Person> { ////处理逻辑和PersonEditor一致 @Override public Person parse(String text, Locale locale) throws ParseException { String[] personStr = text.split("\\|"); Long id = Long.valueOf(personStr[0]); String name = personStr[1]; Integer age = Integer.valueOf(personStr[2]); return new Person(id, name, age); } @Override public String print(Person object, Locale locale) { return object.toString(); }}
Spring MVC下通过WebConfiguration重载WebMvcConfigurer接口的addFormatters方法,使用FormatterRegistry来注册Formatter:
@Configurationpublic class WebConfiguration implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatter(personFormatter()); } @Bean public Formatter personFormatter(){ return new PersonFormatter(); }}
Spring Boot为我们提供了更简单的配置方式,我们只要注册Formatter的Bean即可而无需使用addFormatters方法。
@Beanpublic Formatter personFormatter(){ return new PersonFormatter();}
此时还要要注释掉InitBinderAdvice里的代码注册registerPersonEditor的代码,不然PersonEditor会和PersonFormatter冲突。
除了用addFormatters方法来注册外,我们还可以通过InitBinderAdvice中@InitBinder注解的方法来注册Formatter:
@ControllerAdvicepublic class InitBinderAdvice { @InitBinder public void addPersonFormatter(WebDataBinder binder){ binder.addCustomFormatter(new PersonFormatter()); }}
我们用控制器验证:
@GetMapping("/formatter")public Person formatter(@RequestParam Person person){ return person;}