什么时候使用org.springframework.format.Printer接口?

时间:2018-12-26 10:16:46

标签: spring spring-mvc

当我使用spring-mvc时,我总是使用spring格式化程序将字符串格式化为Java Bean。因此,我实现了org.springframework.format.Formatter接口。
尽管我实现了两种方法(print()parse()),但从未使用过print方法。因为我只使用parse()方法将字符串格式化为Java Bean,而从未将Java Bean格式化为String。
因此,我的问题是,print()会在什么情况下被调用?或者,当我需要将Java Bean格式化为String时。

1 个答案:

答案 0 :(得分:1)

格式化程序可用于解析和打印日期时间戳通用数字数据

这意味着,正如您已经指出的,我们可以通过覆盖 parse()方法来自定义针对特定类型的解析方式。

这还意味着我们可以通过覆盖 print()方法来提供自定义打印行为。

那么,印刷品的用例是什么? 让我们举个例子。

假设您有一个由4个段组成的序列号类型,例如1111-2222-3333-4444。

public class SerialNumber {

  private int segment1;
  private int segment2;
  private int segment3;
  private int segment4;

  //Some getters and setters;

}

现在,我们将实现一个Formatter类,该类可以解析如上所示的输入。为简便起见,我将避免尝试捕获块和验证逻辑:

public class SerialNumberFormatter implements Formatter {

  public SerialNumber parse(String input, Locale locale) {

     //Some code here to validate input

     //Split the input into segments
     String[] result = speech.split("-");

     return new SerialNumber(Integer.parseInt(result[0],
                             Integer.parseInt(result[1],
                             Integer.parseInt(result[2],
                             Integer.parseInt(result[3])

  }

}

因此,通过这种方式,我们设法解析了序列号。但是我们已经知道了。 现在,假设我们要以以下格式“ SN:1111-2222-3333-4444”向最终用户显示存储在数据库中的序列号。我们需要打印对象不知何故。该逻辑可以在print()方法内部实现。

完成我们的Formatter类:

public class SerialNumberFormatter implements Formatter {

  public SerialNumber parse(String input, Locale locale) {

     //Some code here to validate input

     //Split the input into segments
     String[] result = speech.split("-");

     return new SerialNumber(Integer.parseInt(result[0],
                             Integer.parseInt(result[1],
                             Integer.parseInt(result[2],
                             Integer.parseInt(result[3])

  }
  public String print(SerialNumber sn, Locale locale) {

     //Some code here to validate the sn

     return String.format("SN: %d-%d-&d-%d", sn.getSegment1,
                                      sn.getSegment2,
                                      sn.getSegment3,
                                      sn.getSegment4)
  }

}

总而言之, Formatter 允许我们封装与解析和打印有关的逻辑,否则就需要将其编码到业务或服务层中。

请记住,格式化程序也可以由解析器和打印机类组成。因此, print()方法可能包含的打印逻辑要比仅构建String复杂得多。它可以封装逻辑以格式化POJO并将其写入文件。它还可以返回JSON或XML作为输出。

主要将其作为一种抽象,使我们能够将格式化逻辑与其余代码分离。

Formatter接口也是Spring Framework的核心部分。您可以实现自定义格式化程序,然后将其注册到框架中以完成不同的任务。您可以看一下Baeldung的文章:https://www.baeldung.com/thymeleaf-in-spring-mvc

在第8节中,您将欣赏格式化器的实现方式,然后将其注册到Spring MVC中以在前端转换和显示数据。