默认情况下,各种数字和日期类型的格式化器被安装,同时支持通过字段上的 @NumberFormat@DateTimeFormat进行自定义。

    要在 Java 配置中注册自定义格式器和转换器,请使用以下方法:

    1. @Configuration
    2. @EnableWebMvc
    3. public class WebConfig implements WebMvcConfigurer {
    4. @Override
    5. public void addFormatters(FormatterRegistry registry) {
    6. // ...
    7. }
    8. }

    要在 XML 配置中做同样的事情,请使用以下方法:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:mvc="http://www.springframework.org/schema/mvc"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="
    6. http://www.springframework.org/schema/beans
    7. https://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/mvc
    9. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    10. <mvc:annotation-driven conversion-service="conversionService"/>
    11. <bean id="conversionService"
    12. class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    13. <property name="converters">
    14. <set>
    15. <bean class="org.example.MyConverter"/>
    16. </set>
    17. </property>
    18. <property name="formatters">
    19. <set>
    20. <bean class="org.example.MyFormatter"/>
    21. <bean class="org.example.MyAnnotationFormatterFactory"/>
    22. </set>
    23. </property>
    24. <property name="formatterRegistrars">
    25. <set>
    26. <bean class="org.example.MyFormatterRegistrar"/>
    27. </set>
    28. </property>
    29. </bean>
    30. </beans>

    下面一个使用 @DateTimeFormat 的例子

    1. @GetMapping("/data")
    2. public String data(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date)

    默认情况下,Spring MVC 在解析和格式化日期值时考虑了请求的地域性。这适用于日期被表示为字符串的 「input」表单字段。然而,对于 「date」和 「time」表单字段,浏览器使用 HTML 规范中定义的固定格式。在这种情况下,日期和时间的格式化可以按以下方式定制。

    1. @Configuration
    2. @EnableWebMvc
    3. public class WebConfig implements WebMvcConfigurer {
    4. @Override
    5. public void addFormatters(FormatterRegistry registry) {
    6. // 这个是对 java.time(jdk8 的时间 api) 时间相关的格式化,比如 Duration、DataTime 等时间对象
    7. DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
    8. registrar.setUseIsoFormat(true);
    9. registrar.registerFormatters(registry);
    10. }
    11. }

    :::info 参见 FormatterRegistrar SPI 和 FormattingConversionServiceFactoryBean,以了解更多关于何时使用 FormatterRegistrar 实现的信息。 :::