Spring @DateTimeFormat日期格式化时注解浅析分享

这篇具有很好参考价值的文章主要介绍了Spring @DateTimeFormat日期格式化时注解浅析分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总结写前面

关于它 @DateTimeFormat

  1. 可以接收解析前端传入字符时间数据;
  2. 不能格式化接收的字符时间类型数据,需要的转换格式得配置;
  3. 入参格式必须与后端注解格式保持一致,否则会报错;

为什么用

场景:跟前端交互时,接收字符类型的时间值,就需要使用 @DateTimeFormat 注解来解析,否则就会报错;

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testOne")
    public DemoTest testOne(DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    private Date nowTime;
}

请求示例结果:

Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors<EOL>Field error in object 'demoTest' on field 'nowTime': rejected value [2022-11-20 16:42:26,2022-11-20 16:42:01]; codes [typeMismatch.demoTest.nowTime,typeMismatch.nowTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [demoTest.nowTime,nowTime]; arguments []; default message [nowTime]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Date' for property 'nowTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2022-11-20 16:42:26'; nested exception is java.lang.IllegalArgumentException]]

怎么用

场景一

接收非 JSON 格式请求参数。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
     @PostMapping("/testOne")
    public DemoTest testOne(DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:form-data
    Spring @DateTimeFormat日期格式化时注解浅析分享

从结果可以看出,@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 可以保证接收解析前端传入的字符时间参数,但是并不能完成时间格式化操作,如果需要获取想要的时间格式,是需要自己手动转换的。

场景二

接收 JSON 格式请求数据,与场景一的区别是请求的数据格式:

  • 场景一:form-data
  • 场景二:JSON
@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testTwo")
    public DemoTest testTwo(DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    Spring @DateTimeFormat日期格式化时注解浅析分享

从结果可以看出,返回数据 nowTime 是空的,因为这里的Controller层没有使用 @RequestBody 去接收 JSON 格式的数据,而 Spring 默认的转换器类型是不包含 JSON 的(有兴趣的可以看下 org.springframework.core.convert.support 包,这里面包含Spring支持的默认转换器)。

场景三

场景三跟场景二的区别就是,在 Controller 层方法入参配合使用 @RequestBody 去接收 JSON 格式,使用该注解会自动调用对应的JSON转换器。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSONSpring @DateTimeFormat日期格式化时注解浅析分享

这里可以看到,请求报错400,导致400的原因比较多,这里只说明一下场景三,场景三中使用 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解格式与请求入参格式不一致,所以会导致请求报错;

Spring @DateTimeFormat日期格式化时注解浅析分享

大概意思就是说,Spring 框架在尝试转换参数的过程中,没有找到合适接收格式导致转换失败。(注意!注意!注意!讲三遍,所以前端入参格式必须与后端约定格式保持一致,否则会报错)。

场景四

场景四的目的是为了解决场景一中时间格式化的问题。

关于 @JsonFormat 注解,可以看看我的另一篇blog中有做分享,感兴趣的大佬可以去看看,附上传送门:@JsonFormat 和 @DateTimeFormat 时间格式化注解详解(不看血亏)

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:form-dataSpring @DateTimeFormat日期格式化时注解浅析分享

场景五

方式一

针对场景四的数据请求格式是 form-data,场景五来说明 JSON 同样适用。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    Spring @DateTimeFormat日期格式化时注解浅析分享

方式二

可以继承 Spring 提供的org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer 来进行全局配置。

@RestController
@RequestMapping("/demo")
public class DemoTestController {
    @PostMapping("/testThree")
    public DemoTest testThree(@RequestBody DemoTest demoTest){
        return demoTest;
    }
}

@Data
public class DemoTest {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date nowTime;
}

@Configuration
public class CustomsDateConvert implements Jackson2ObjectMapperBuilderCustomizer {
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        String dateFormat = "yyyy-MM-dd HH";
        // 针对于Date类型,文本格式化
        jacksonObjectMapperBuilder.simpleDateFormat(dateFormat);
        // 针对于JDK新时间类。序列化时带有T的问题,自定义格式化字符串
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateFormat)));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateFormat)));
        jacksonObjectMapperBuilder.modules(javaTimeModule);
    }
}

/**
 * 解决Jackson2ObjectMapperBuilderCustomizer失效问题
 */
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class ConvertConfiguration implements WebMvcConfigurer {

    @Autowired(required = false)
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
        if (Objects.isNull(mappingJackson2HttpMessageConverter)) {
            converters.add(0, new MappingJackson2HttpMessageConverter());
        } else {
            converters.add(0, mappingJackson2HttpMessageConverter);
        }

    }
}

请求示例结果:

  • 请求:POST

  • 数据格式:JSON
    Spring @DateTimeFormat日期格式化时注解浅析分享文章来源地址https://www.toymoban.com/news/detail-435651.html


Spring @DateTimeFormat日期格式化时注解浅析分享感 谢 各 位 大 佬 的 阅 读,随 手 点 赞,日 薪 过 万~! !!

到了这里,关于Spring @DateTimeFormat日期格式化时注解浅析分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js实现日期格式化

    获取到的是1970年1月1日至今的毫秒数 月份从0开始的所以要加1 实现日期格式化效果图 日期格式化实现效果图 其中包含封装一个不够两位数就补零的函数 一个不够两位数就补零的函数

    2024年02月13日
    浏览(77)
  • 【Java】SimpleDateFormat格式化日期

    SimpleDateFormat 是用于以区域设置敏感的方法格式化和解析日期。它允许格式化(日期文本),解析(文本日期) 对时间日期进行格式化处理 把Date对象转换为年月日时分秒格式字符串 把字符串转换为Date对象 常用的模式字母及对应关系如下:yyyy年MM月dd日HH时mm分ss秒 y 年,M 月

    2024年04月16日
    浏览(45)
  • SQL Server日期格式化

    一、时间戳的生成 使用dateDiff方法,运算当前时间到标准时间之间的秒数。 DATEDIFF(s,‘1970-01-01 00:00:00’, getdate()) 二、日期格式转换 使用convert(data_type,source_data,style)进行格式转换。利用style控制转换格式。 结果: CONVERT(nvarchar(80),getdate(),0)----07 27 2022 8:33AM CONVERT(nvarchar(80),getd

    2024年02月06日
    浏览(52)
  • MySQL中日期格式化详解

    日期在数据库中是一个常见且重要的数据类型,在MySQL中,我们可以使用各种函数和格式化选项来处理和显示日期。本文将详细介绍MySQL中的日期格式化方法,并提供相应的源代码示例。 DATE_FORMAT函数 DATE_FORMAT函数是MySQL中用于格式化日期的常用函数。它接受两个参数:日期值

    2024年02月06日
    浏览(45)
  • EasyExcel格式化映射注解和样式注解详解

    使用注解很简单,只要在对应的实体类上面加上注解即可。 也就是说使用实体类模型来读写 Excel 文件时,可以通过注解来控制实体类字段和 Excel 列之间的对应关系。 2.1 作用 ExcelProperty 注解用于匹配 excel 和实体类字段之间的关系。 可以作用于字段上。 2.1 注解参数 名称 默

    2024年01月20日
    浏览(31)
  • Excel TEXT函数格式化日期

    ⏹Excel 的 TEXT 函数用于将数值或日期格式化为指定的文本格式

    2024年02月21日
    浏览(72)
  • SQL SERVER 中日期格式化

    目录 1.date和datetime类型的区别 2. GETDATE()函数,返回当前日期时间(datetime类型) 3. CONVERT()函数,格式化日期 4. DATEPART() 函数  date是SQL Server 2008新引进的数据类型。它表示一个日期,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日。只需要3个字节的存

    2024年02月04日
    浏览(69)
  • Java格式化日期,时间(三种方法)

    在java中String类格式化的方法,是静态format()用于创建格式化的字符串。 format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。 format(Locale locale, String format, Object... args) 使用指定的语言环境,制定字符串格式和参数生成格式化

    2024年02月13日
    浏览(55)
  • java.text.ParseException及日期格式化

    在优化接口时,遇到该异常,导致前端页面一直报500错误:  Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.text.ParseException: Unparseable date: \\\"Fri Apr 07 20:16:19 CST 2023\\\"] with root cause java.text.ParseExcept

    2024年02月09日
    浏览(43)
  • 【JavaScript】JavaScript日期和时间的格式化:

    一、日期和时间的格式化 1、原生方法 【1】使用 toLocaleString 方法 【2】使用 Intl.DateTimeFormat 对象 2、使用字符串操作方法 3、自定义格式化函数 【1】不可指定格式的格式化函数 【2】可指定格式的格式化函数 4、使用第三方库 二、日期和时间的其它常用处理方法 1、创建 Dat

    2024年02月10日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包