使用fastjosn作为消息转换器,与openapi冲突问题

简介: 从Swagger 2升级到SpringDoc过程中,初整合SpringSecurity时遭遇重重难关。首战主页访问受阻,调整安全配置终通行。次遇文档版本不明,困惑不已。最棘手乃JSON序列化问题,快被逼疯。导师相助锁定疑点,在日期处理上,Fastjson与SpringDoc不兼容。解决方案:或回归Jackson,或自定义Fastjson字符串序列化器。经历三日奋战,终告捷,感慨良多。

以前用的swagger2,忽然发现springdoc还在更新,就开始尝试新玩法,项目中加入了springsecutiry,第一次使用过程中还是遇到许多的bug,最终还有一个非常不理解的问题,经导师寻找最终找到问题所在,终解决,感动两年半,下面细谈:
首先遇到第一个bug,死活进不去主页http://localhost:8080/swagger-ui/index.html#/
这是swagger的文档,找着找着才忽然发现自己把自己拦截了,赶紧把自己放过去
.antMatchers(
HttpMethod.GET, // Swagger的资源路径需要允许访问
"/",
"/swagger-ui.html",
"/swagger-ui/",
"/.html",
"/favicon.ico",
"/swagger-resources/",
"/v3/api-docs/
"
// "/swagger-ui/index.html",
// "/swagger-ui.html",
// "/swagger-ui/*",
// "/v3/api-docs/
",
// "/v3/api-docs"
).permitAll()
终于进去了!!!当我以为我已经成功了,没想到:
Unable to render this definition
The provided definition does not specify a valid version field.

Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: "2.0" and those that match openapi: 3.0.n (for example, openapi: 3.0.0).
image.png

这个问题把我尬住了,以前也算是遇过,把各种问题排除,以及不断的尝试,死活过不去,真是一个bug找了两年半,看不太懂底层,没办法一个个排,只能硬找,通过三天三夜的努力,我成功放弃了,我找不到!!!!!
image.png

都有接收到,但是json序列化炸了,真是理解不能。
好不容易熬到周一,赶紧找我导师问一问,经过他一顿操作,帮我锁定了问题,说把一段代码注释掉就行,我当场蒙蔽了,一尝试就可以了!!--------无语
原来根本不是我配置的问题,因为在处理日期json序列化的时候,我们一般有三种方法:

  • @JSONField(format = "...")来指定格式
  • .setDateFormat("...")指定全局Date字段的序列化格式
  • setSerializerFeatures(SerializerFeature.WriteDateUseDateFormat)
            指定全局Date字段的默认序列化格式。
    

这三种方式存在着优先级:方式二 > 方式一 > 方式三,当前一级出现的时候,会直接覆盖掉下一层的配置,具体细看::pringBoot使用fastjosn作为消息转换器、fastjosn对日期的处理、自定义序列化器解决SerializerFeature兼容问题

对此真的没想到,然后通过一段操作,发现是序列化的问题!!!---哭了
原本是不想通过JSONFieLId来对一个个字段进行指定的操作,嫌弃麻烦,就通过消息HttpMessageConverter操作,注入到@bean中,虽然经过一波查询,感觉到参数模型传递错误的bug,但是实在排查不出来,这个在序列化的时候fastjson对此作了特殊处理,因此可以保持原样。而改换springdoc时,此处传入的class却是String! 而fastjson默认会对String进行处理,加上转义符号,因此导致最终的结果出现异常。),真没想到是这种大无语事件,对此我们有两种方式解决:
//

  1. 换成Jackson的converter(springboot默认就是Jackson)。
  2. FastJsonHttpMessageConverter:自定义一个StringSerializer,覆盖掉fastjson的默认的StringSerializer

由于实在太懒了,决定自定义一个序列化的,覆盖掉原来的操作。

public class MyStringSerializer implements ObjectSerializer {
   
   
    public static final MyStringSerializer instance = new MyStringSerializer();
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
   
   
        SerializeWriter out = serializer.getWriter();
        out.write(object.toString());
    }
}

然后在FastJsonHttpMessageConverter的配置文件中,如下使用
fastJsonConfig.getSerializeConfig().put(String.class,MyStringSerializer.instance);

最终取得成功,感动死我了!!!!!!

image.png

参数还没修改见谅,就此结束,大家可以参考下,别踩雷了!!!

相关文章
|
关系型数据库 MySQL Nacos
nacos数据库使用PostgreSQL及集群配置
从Nacos2.2版本开始,Nacos提供了数据源扩展插件,以便让需要进行其他数据库适配的用户自己编写插件来保存数据。
|
Java Spring
Spring Boot3整合knife4j(swagger3)
Spring Boot3整合knife4j(swagger3)
3600 1
|
6月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
3184 1
|
12月前
|
存储 NoSQL 关系型数据库
从大数据到大模型:如何做到“心无桎梏,身无藩篱”
在大数据和大模型的加持下,现代数据技术释放了巨大的技术红利,通过多种数据范式解除了数据的桎梏,使得应用程序达到了“心无桎梏,身无藩篱”的自在境界,那么现代应用有哪些数据范式呢?这正是本文尝试回答的问题。
1693 101
|
11月前
|
监控 Java Nacos
使用Spring Boot集成Nacos
通过上述步骤,Spring Boot应用可以成功集成Nacos,利用Nacos的服务发现和配置管理功能来提升微服务架构的灵活性和可维护性。通过这种集成,开发者可以更高效地管理和部署微服务。
3468 17
|
Java Spring
spring-doc报错Unable to render this definition
spring-doc报错Unable to render this definition
876 0
|
JSON Java 数据格式
Java系列之:如何取出嵌套JSON中的数据值
这篇文章介绍了如何在Java中取出嵌套JSON数据值的方法,通过使用`JSONObject`类及其`getJSONObject`和`get`方法来逐步解析和提取所需的数据。
Java系列之:如何取出嵌套JSON中的数据值
|
XML JSON Java
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
1570 1
|
JSON Java API
Spring Boot中使用OpenAPI生成API文档
Spring Boot中使用OpenAPI生成API文档
|
Java 数据安全/隐私保护 Spring
Springboot 中引入 SpEL,复杂权限控制轻松搞定,非常优雅!
Springboot 中引入 SpEL,复杂权限控制轻松搞定,非常优雅!
458 1