前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编写一个spring-boot-starter-fastjson

编写一个spring-boot-starter-fastjson

作者头像
阿超
发布2022-08-21 12:55:05
4040
发布2022-08-21 12:55:05
举报
文章被收录于专栏:快乐阿超快乐阿超

这个starter是自己写的,主要就是注入了个FastJsonConfig

写法如下:首先引入gav,完整pom.xml如下:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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这里简单用于设定时间日期格式化的表达式

代码语言:javascript
复制
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下配置

目录结构如下:

代码语言:javascript
复制
src
 └	main
 	 └	 java
 	 └	 resources
 	 	  └ META-INF
 	 	   	 └ spring.factories

目录对了一般会有图标提示

spring.factories里面指定我们的配置类

代码语言:javascript
复制
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ruben.config.FastJsonAutoConfiguration

我们可以尝试使用一下,首先用maven进行install

image-20220322184002930
image-20220322184002930
image-20220322184021994
image-20220322184021994

然后到另一个项目中使用

引入GAV

代码语言:javascript
复制
<dependency>
	<groupId>com.ruben</groupId>
	<artifactId>spring-boot-starter-fastjson</artifactId>
	<version>1.0</version>
</dependency>

配置文件这边其实已经可以看到提示了

image-20220322190036281
image-20220322190036281

我们配置其中一个

代码语言:javascript
复制
fastjson:
  date-pattern: yyyy年MM月dd日

测试一下:

代码语言:javascript
复制
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日");
    }


}

成功~

image-20220322190343065
image-20220322190343065

starter的完整代码我放到了这里:https://gitee.com/VampireAchao/spring-boot-starter-fastjson.git

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档