编写一个spring-boot-starter-fastjson

简介: 编写一个spring-boot-starter-fastjson

酷烈之祸,多起于玩忽之人;盛满之功,常败于细微之事。——《菜根谭》

这个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>


然后是编写ConfigurationProperties

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

相关文章
|
4月前
|
消息中间件 安全 Java
学习认识Spring Boot Starter
在SpringBoot项目中,经常能够在pom文件中看到以spring-boot-starter-xx或xx-spring-boot-starter命名的一些依赖。例如:spring-boot-starter-web、spring-boot-starter-security、spring-boot-starter-data-jpa、mybatis-spring-boot-starter等等。
68 4
|
3月前
|
Java Maven 开发者
Spring Boot中的自定义Starter开发
Spring Boot中的自定义Starter开发
|
5月前
|
Java Maven 数据库
Spring Boot Starter: 快速简明地创建Spring应用
Spring Boot Starter: 快速简明地创建Spring应用
|
Java Spring
spring学习笔记(六)自定义spring-boot-starter(2)
上篇文章我们主要讲了spring自动装配的原理,我们知道了springboot在启动的时候会自动去读.factories文件,在factories文件中,autoConfiguration对应的就是我们程序启动时自己预加载的类,另外我也提到了另外一个比较核心的注解,即@ConditionOnxxx。详情点击https://blog.csdn.net/qq_41907991/article/details/88704448。
129 0
spring学习笔记(六)自定义spring-boot-starter(2)
|
Java Spring
spring学习笔记(五)自定义spring-boot-starter(1)
spring学习笔记(五)自定义spring-boot-starter(1)
104 0
spring学习笔记(五)自定义spring-boot-starter(1)
|
Java Spring
「Spring Boot 系列」07. Spring Boot整合Junit
「Spring Boot 系列」07. Spring Boot整合Junit
137 0
「Spring Boot 系列」07. Spring Boot整合Junit
|
安全 Java 开发者
【Spring Boot 快速入门】六、Spring Boot集成Lombok
【Spring Boot 快速入门】六、Spring Boot集成Lombok
169 0
【Spring Boot 快速入门】六、Spring Boot集成Lombok
|
Java 测试技术 Maven
【Spring Boot 快速入门】四、Spring Boot集成JUnit
【Spring Boot 快速入门】四、Spring Boot集成JUnit
316 0
【Spring Boot 快速入门】四、Spring Boot集成JUnit
|
Java Apache Spring
Spring Boot中使用EasyPoi入门
主要介绍如何使用EasyPoi的注解来完成简单的Excel导入、导出操作
Spring Boot中使用EasyPoi入门
|
消息中间件 NoSQL Java
《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》
pring Boot 的便利性体现在,它简化了很多烦琐的配置,这对于开发人员来说是一个福音,通过引入各种 Spring Boot Starter 包可以快速搭建出一个项目的脚手架
267 0