编写一个spring-boot-starter-fastjson
2023-06-13 09:11:17 时间
这个starter
是自己写的,主要就是注入了个FastJsonConfig
写法如下:首先引入gav
,完整pom.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ruben</groupId>
<artifactId>spring-boot-starter-fastjson</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<fastjson-version>1.2.79</fastjson-version>
<lombok-version>1.18.22</lombok-version>
<hutool-version>5.7.22</hutool-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson-version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-bom</artifactId>
<version>${hutool-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然后是编写Configuration
和Properties
package com.ruben.config;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.lang.Opt;
/**
* FastJson配置
*
* @author <achao1441470436@gmail.com>
* @since 2021/10/9 12:42
*/
@EnableConfigurationProperties(FastJsonProperties.class)
public class FastJsonAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public FastJsonConfig fastJsonConfig(FastJsonProperties fastJsonProperties) {
FastJsonConfig fastJsonConfig = new FastJsonConfig();
// 配置序列化策略
// ID_WORKER 生成主键太长导致 js 精度丢失
// JavaScript 无法处理 Java 的长整型 Long 导致精度丢失,具体表现为主键最后两位永远为 0,解决思路: Long 转为 String 返回
fastJsonConfig.setSerializerFeatures(SerializerFeature.BrowserCompatible,
// 处理序列化后出现$ref的坑
SerializerFeature.DisableCircularReferenceDetect,
// 列化枚举值为数据库存储值
SerializerFeature.WriteEnumUsingToString);
SerializeConfig serializeConfig = SerializeConfig.globalInstance;
// 设置全局LocalDateTime转换
fastJsonConfig.setDateFormat(fastJsonProperties.getDatePattern());
serializeConfig.put(LocalDateTime.class, (serializer, object, fieldName, fieldType, features) ->
Opt.ofNullable(object).ifPresentOrElse(obj ->
serializer.out.writeString(
LocalDateTimeUtil.format((LocalDateTime) obj, fastJsonProperties.getLocalDateTimePattern())
),
serializer.out::writeNull));
serializeConfig.put(LocalDate.class, (serializer, object, fieldName, fieldType, features) ->
Opt.ofNullable(object).ifPresentOrElse(obj -> serializer.out.writeString(
LocalDateTimeUtil.format((LocalDate) obj, fastJsonProperties.getLocalDatePattern())
),
serializer.out::writeNull));
fastJsonConfig.setSerializeConfig(serializeConfig);
ParserConfig parserConfig = ParserConfig.getGlobalInstance();
fastJsonConfig.setParserConfig(parserConfig);
return fastJsonConfig;
}
}
Properties
这里简单用于设定时间日期格式化的表达式
package com.ruben.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import cn.hutool.core.date.DatePattern;
import lombok.Data;
/**
* 配置文件
*
* @author <achao1441470436@gmail.com>
* @since 2022/3/20 18:10
*/
@Data
@ConfigurationProperties(FastJsonProperties.PREFIX)
public class FastJsonProperties {
public static final String PREFIX = "fastjson";
private String datePattern = DatePattern.NORM_DATETIME_PATTERN;
private String localDateTimePattern = DatePattern.NORM_DATETIME_PATTERN;
private String localDatePattern = DatePattern.NORM_DATE_PATTERN;
}
然后别忘了在resources
下配置
目录结构如下:
src
└ main
└ java
└ resources
└ META-INF
└ spring.factories
目录对了一般会有图标提示
spring.factories
里面指定我们的配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ruben.config.FastJsonAutoConfiguration
我们可以尝试使用一下,首先用maven
进行install
然后到另一个项目中使用
引入GAV
<dependency>
<groupId>com.ruben</groupId>
<artifactId>spring-boot-starter-fastjson</artifactId>
<version>1.0</version>
</dependency>
配置文件这边其实已经可以看到提示了
我们配置其中一个
fastjson:
date-pattern: yyyy年MM月dd日
测试一下:
package com.ruben.simplescaffold;
import javax.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import com.alibaba.fastjson.support.config.FastJsonConfig;
/**
* Springboot测试类
*
* @author <achao1441470436@gmail.com>
* @since 2021/7/11 0011 18:11
*/
@SpringBootTest
class SimpleScaffoldApplicationTests {
@Resource
private FastJsonConfig fastJsonConfig;
@Test
void testFastJsonConfig() {
Assertions.assertEquals(fastJsonConfig.getDateFormat(), "yyyy年MM月dd日");
}
}
成功~
starter
的完整代码我放到了这里:https://gitee.com/VampireAchao/spring-boot-starter-fastjson.git
相关文章
- Spring学习笔记(十八)——spring日志框架的配置和使用
- spring boot tomcat 版本_springboot命令行启动
- batch spring 重复执行_Spring Batch批处理
- Spring Cloud版本冲突(java.lang.NoClassDefFoundError:org/springframework/boot/Bootstrapper)
- Spring Boot默认数据库连接池HikariPool
- Spring入门
- Spring Boot文件上传
- 一个用来深度学习并实战 Spring Boot 的项目,共 66 个集成demo
- Spring Boot使用websocket实现聊天室
- 烧脑巨作,Spring Boot请求处理(常用参数注解使用)
- 昨天面了一位,见识到了Spring的天花板~
- SpringBoot:模块探究之spring-boot-starters
- 记一次Spring中HttpMessageConverter的源码分析
- 用Spring Boot复刻一款天猫商城,你可以做到!
- Nacos 2.0的Spring Boot Starter来了!
- 什么是Spring Boot
- Spring Boot 中 @EnableXXX 注解的驱动逻辑
- 事务隔离属性、spring传播属性、 @Transactional注解详解数据库
- spring boot开发 静态资源加载不出来详解编程语言
- spring cloud教程之使用spring boot创建一个应用详解编程语言
- spring集成redis cluster详解大数据
- Spring Boot入门第二天:一个基于Spring Boot的Web应用,使用了Spring Data JPA和Freemarker。详解编程语言
- spring Boot(十九):使用Spring Boot Actuator监控应用详解编程语言
- Spring Boot(十三):spring boot小技巧详解编程语言
- Spring setConnectionProperties方法:设置数据库连接的各种属性
- Spring setUrl方法:设置连接数据库的URL路径