springboot~http请求和响应的字段格式化

news/2025/2/5 10:58:46/文章来源:https://www.cnblogs.com/lori/p/18698975

我们以日期类型为例,把它作为请求参数和响应字段进行说明,默认的日期字段格式为ISO 8601标准,DateTimeFormat.ISO.DATE_TIME,格式为yyyy-MM-dd'T'HH:mm:ss,与咱们常用的日期时间有所不同,所以咱们需要重新定义一下。

本文功能

  • 统一了日期参数,由传入的字符串传为java对象
  • 统一了返回实体的日期字段,默认是iso8601
  • 统一了返回实体的长整型返回值精度丢失问题,统一传为字符串

请求参数统一处理

  • 请求参数前端输入的是字符串
  • 接口类型LocalDate 传入的格式匹配yyyy-MM-dd
  • 接口类型LocalTime 传入的格式匹配HH:mm:ss
  • 接口类型LocalDateTime 传入的格式匹配yyyy-MM-dd'T'HH:mm:ss
/*** WebMvc配置.** @author lind* @date 2023/5/24 14:46* @since 1.0.0*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {static DateTimeFormatter DT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");static DateTimeFormatter T_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");static DateTimeFormatter D_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");/*** 增加GET请求参数中时间类型转换,注意是LocalTime,LocalDate和LocalDateTime,因为你配置的是DateTimeFormatter.* <ul>* <li>HH:mm:ss -> LocalTime</li>* <li>yyyy-MM-dd -> LocalDate</li>* <li>yyyy-MM-dd HH:mm:ss -> LocalDateTime</li>* </ul>* @param registry*/@Overridepublic void addFormatters(FormatterRegistry registry) {DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();// 对输入参数转为LocalDate,LocalTime,LocalDateTime格式化registrar.setTimeFormatter(T_FORMATTER);registrar.setDateFormatter(D_FORMATTER);registrar.setDateTimeFormatter(DT_FORMATTER);registrar.registerFormatters(registry);// 对输入参数转为java.util.Date格式化registry.addFormatter(new CompositeFormatter());}/*** java.util.Date日期格式化.*/private static class CompositeFormatter implements Formatter<Date> {private final List<Formatter<Date>> formatters = Arrays.asList(new DateFormatter("yyyy-MM-dd HH:mm:ss"),new DateFormatter("yyyy-MM-dd"), new DateFormatter("HH:mm:ss"));@Overridepublic Date parse(String text, Locale locale) throws ParseException {for (Formatter<Date> formatter : formatters) {try {return formatter.parse(text, locale);}catch (ParseException ignored) {}}throw new ParseException("Unable to parse date: " + text, 0);}@Overridepublic String print(Date date, Locale locale) {return formatters.get(0).print(date, locale);}}}

响应体中字段的格式化

  • 默认采用jackson进行java对象到json的格式化,我们也以这个为例
  • 其实json序列化方式需要自行实现
/*** json响应配置. Long到字符串,避免Long被截取 Date日期格式化 LocalDate日期格式化** @author lind* @date 2023-08-16*/
@Configuration
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class) // 在JacksonAutoConfiguration之前加载
public class JacksonConfiguration {@Bean@ConditionalOnMissingBeanpublic Jackson2ObjectMapperBuilderCustomizer customizer() {return builder -> {builder.locale(Locale.CHINA);builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));// 早期的Date类型的格式化,默认的返回日期2022-04-21T10:28:00,添加后返回日期2022-04-21 10:28:07builder.simpleDateFormat(JavaTimeModule.NORM_DATETIME_PATTERN);// java8建议的LocalDate,LocalDateTime,LocalTime的格式化builder.modules(new JavaTimeModule());// Long 类型转 String 类型,避免js丢失精度builder.serializerByType(Long.class, ToStringSerializer.instance);};}}

JavaTimeModule可以根据自己的地区去配置

public class JavaTimeModule extends SimpleModule {public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";public static final DateTimeFormatter NORM_DATETIME_FORMATTER = createFormatter(NORM_DATETIME_PATTERN);public JavaTimeModule() {super(PackageVersion.VERSION);// ======================= 时间序列化规则 ===============================// yyyy-MM-dd HH:mm:ssthis.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(NORM_DATETIME_FORMATTER));// yyyy-MM-ddthis.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));// HH:mm:ssthis.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME));// Instant 类型序列化this.addSerializer(Instant.class, InstantSerializer.INSTANCE);// ======================= 时间反序列化规则 ==============================// yyyy-MM-dd HH:mm:ssthis.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(NORM_DATETIME_FORMATTER));// yyyy-MM-ddthis.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));// HH:mm:ssthis.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME));// Instant 反序列化this.addDeserializer(Instant.class, InstantDeserializer.INSTANT);}public static DateTimeFormatter createFormatter(String pattern) {return DateTimeFormatter.ofPattern(pattern, Locale.getDefault()).withZone(ZoneId.systemDefault());}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879003.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中的文件流File

数据 + 流(转)操作 IO I表示的是:输入Input O表示的是:Output Stream表示流转 java中的管道不止一个。并且管道有可能不是一样的。 有的管道粗有的管道细File的常用方法 文件/目录信息 isFile()判断是否是一个文件,返回是一个布尔值,true表示文件。false不是文件 isDirectory…

自建ES集群CVM IO问题

ES集群故障问题描述永辉自建ES集群CVM 出现IO Hang的情况,子机无法登陆,进程也无法kill掉,需要进行节点重启切换来恢复业务。问题背景:2021-05-31日客户侧TKE三台子机的io Await很高,使用的都是本地nvme盘子机,这边登陆了一台机器上面检查发现cpu使用率和io的等待时间都很…

代码随想录——单调栈

单调栈 要求「从 栈顶 到 栈底 的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。(有的文章是从栈底到栈顶,本文默认从栈顶到栈底) 怎么能想到用单调栈呢?…

在线协作软件怎么选?从团队规模到项目需求,这篇指南全告诉你!

在线协作软件已经成为现代团队不可或缺的工具。无论是国外成熟的 Trello、Asana,还是国内功能强大的板栗看板,都各有特色,能够满足不同团队的需求。希望本文推荐的软件能够帮助您找到最适合团队的协作利器,提升工作效率,实现团队目标。在数字化时代,远程办公和团队协作已…

win11下如何选择7-zip为默认的压缩软件打开方式

推荐各位使用7-zip压缩文件,好用,体积小,内存占用少,压缩速度快。这个软件免费,很良心的软件 第1步:进入你安装好的7-zip目录,找到7zFM.exe文件第2步:找到弹窗的“工具”菜单,在此菜单中找到“选项”。然后按照下图方式进行操作第3步:任意找到系统中的一个压缩文件,…

推荐一个便宜、效果挺好的机场。

【DOVE云】全球网络加速服务,在网络世界里畅游,低至¥20CNY/月 https://dovee.cc/aff.php?akaupx1Esky3QQf9

DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型

DeepSeek-R1 通过创新的训练策略实现了显著的成本降低,同时保持了卓越的模型性能。本文将详细分析其核心训练方法。 成本优势对比 在推理成本方面,DeepSeek-R1 展现出显著优势:输入 tokens : $0.55/百万 tokens 输出 tokens : $2.19/百万 tokens相比之下,O1 的推理成本:输…

Kubernetes集群安全(八)

基本安全机制说明:Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介,也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。Kubernetes 使用了认证(Authenticatio…

修改Linux环境下Springboot项目读取配置文件路径

Springboot项目,修改Linux读取配置文件路径1、在“src/main/resources/META-INF/spring.factories”增加文件路径: org.springframework.boot.env.EnvironmentPostProcessor=\com.code.config.ConfigEnvironmentPostProcessor 2、在指定路径下创建文件:ConfigEnvironmentPos…

离职注意事项

离职前,有几个文件夹是必须删除的: 1.个人文件夹 在离职前,一定要清除个人文件夹里的所这有文件。这些文件可能包括个人照片、简历、工作笔记、项目文件等。这些文件包含了你的个人信息以及公司的商业机密,如果不及时删除,可能会给公司带来潜在的风险。 2. 邮件文件夹 如果…

使用国内镜像源

export HF_ENDPOINT=https://hf-mirror.compip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

AI 工程必读好书:10 本关于 AI 科学与工程的深刻见解

AI 工程的必读书籍 —— 以及《Brave New Words》(图片为作者原创作品) 几年前,我推荐了 《数据科学必读好书》 和 《数据科学必读好书 2》 中的 21 本书。自那以后,很多事情发生了变化。虽然数据科学家和机器学习工程师仍然是大型公司的必要岗位,但 “AI 工程师” 这一特定…