本章主要讲述的是Formatter这个类的使用方法

简介

  1. package org.springframework.format;
  2. public interface Formatter<T> extends Printer<T>, Parser<T> {
  3. }
  • Formatter继承了两个接口,因此得到了两个需实现的方法,String print(T fieldValue, Locale locale)和parse(String clientValue, Locale locale)
  • print:用于将服务器的出参格式化,成一个String
  • parse:将入参进行解析成任意类型

    使用例子

  1. 实现一个Formatter

    1. public class MyFormatter implements Formatter<Date> {
    2. private String pattern;
    3. public MyFormatter(String pattern) {
    4. this.pattern = pattern;
    5. }
    6. @Override
    7. public String print(Date date, Locale locale) {
    8. if (date == null) {
    9. return "";
    10. }
    11. return getDateFormat(locale).format(date);
    12. }
    13. @Override
    14. public Date parse(String formatted, Locale locale) throws ParseException {
    15. if (formatted.length() == 0) {
    16. return null;
    17. }
    18. return getDateFormat(locale).parse(formatted);
    19. }
    20. protected DateFormat getDateFormat(Locale locale) {
    21. DateFormat dateFormat = new SimpleDateFormat(this.pattern, locale);
    22. dateFormat.setLenient(false);
    23. return dateFormat;
    24. }
    25. }
  2. 可以声明一个Annotation ```java @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) public @interface MyFormatAnno {

    String pattern() default “yyyy-MM-dd HH:mm:ss”;

}

  1. 3. 实现一个AnnotationFormatterFactory<T>
  2. ```java
  3. /**
  4. * @author GaoXi
  5. * @date 2022/1/25 20:51
  6. */
  7. public class MyFormatAnnoFormatterFactory implements AnnotationFormatterFactory<MyFormatAnno> {
  8. @Override
  9. public Set<Class<?>> getFieldTypes() {
  10. return new HashSet<>(Collections.singletonList(Date.class));
  11. }
  12. @Override
  13. public Printer<?> getPrinter(MyFormatAnno annotation, Class<?> fieldType) {
  14. return new MyFormatter(annotation.pattern());
  15. }
  16. @Override
  17. public Parser<?> getParser(MyFormatAnno annotation, Class<?> fieldType) {
  18. return new MyFormatter(annotation.pattern());
  19. }
  20. }

疑问点

  1. FormatterRegistry SPI
  2. FormatterRegistrar SPI

SpringMVC中的配置

这个Formatter一定是和客户端交互时使用的。所以官方文档链接到SpringMVC章节讲解。我们在例子中写好的这个东西如何去用

@DateFormatter

  1. 这个Formatter注解是Spring自带的。
  2. 对于接收参数有用(非Json的)
  3. 对于返回Json格式化无效

    自定义的使用方式

  4. 需要配置

    1. @Configuration
    2. //@EnableWebMvc 一定不要加,除非你想完全重写配置
    3. public class WebConfig implements WebMvcConfigurer {
    4. @Override
    5. public void addFormatters(FormatterRegistry registry) {
    6. registry.addFormatterForFieldAnnotation(new MyFormatAnnoFormatterFactory());
    7. }
    8. }
  5. 效果同@DateFormatter

    为什么对返回值无效

    因为返回JSON走的是Jackson的序列化机制,不走@DateTimeFomatter机制。所以无效。

参考其他文章