alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.78k stars 495 forks source link

不兼容最新版本springboot #722

Closed jiangqiang1996 closed 1 year ago

jiangqiang1996 commented 2 years ago

扩展包使用到了javax.servlet.ServletOutputStream类,最新版springboot使用的类jakarta.servlet.ServletOutputStream

包名变化导致不兼容问题。

wenshao commented 2 years ago

是哪个类不兼容了?

jiangqiang1996 commented 2 years ago

是哪个类不兼容了?

image

Fastjson2项目里面使用到javax.servlet包下的代码多数都不兼容吧。但是目前只遇到图片中这个类不兼容,我使用的springboot3环境,这个异常类名字变了,导致找不到该class,因此我在项目里创建了一个和该类名字一样的异常class,貌似可以正常运行。

jiangqiang1996 commented 2 years ago

是哪个类不兼容了?

看编辑器提示,貌似httpservletrequest和httpservletservletresponse这两个类也是找不到的, 因为springboot是Tomcat10的环境,但是我运行的时候只会报错找不到javax.servlet.ServletOutputStream,所以我自己写了一个同名的类,暂时可以运行。

wenshao commented 2 years ago

javax.servlet这个是标准,错误应该不是你说的原因,你补上这个依赖试试看

https://repo1.maven.org/maven2/javax/servlet/javax.servlet-api/4.0.1/

jiangqiang1996 commented 2 years ago

javax.servlet这个是标准,错误应该不是你说的原因,你补上这个依赖试试看

https://repo1.maven.org/maven2/javax/servlet/javax.servlet-api/4.0.1/

你发的这个里面最近更新是2018年了,之前java官方因为版权原因把包名改了。你可以看看这个https://repo1.maven.org/maven2/jakarta/servlet/jakarta.servlet-api/ 这个才是最新的标准,目前大多数第三方关于javaee的包都有这个不兼容问题,javax全部改成了jakarta

wenshao commented 2 years ago

最新版本的spring-web 5.3.22依赖的也是javax.servlet

jiangqiang1996 commented 2 years ago

servlet.api这个标准并非sun制定的,也不是甲骨文制定的,而是Jakarta组织制定的,javax.servlet实现是sun公司写的,现在属于甲骨文,所以Jakarta组织不能再使用javax.servlet作为包名,因为是别人的东西。最新的标准修改了包名,导致很多依赖有问题。 你可以去看看Tomcat10,全部使用的Jakarta作为包名,最新的spring6也是Jakarta。

jiangqiang1996 commented 2 years ago
image image

上面两个图片可以对比一下,Fastjson既然是下一个十年的产物,自然得兼容未来,可以适当抛弃过去。国产java工具包hutool专门针对servlet提供了两个工具类,就是因为这个原因。

image

目前阿里的druid数据源的web监控页面也是有这个问题

wenshao commented 2 years ago

收到,感谢告知,我之前还没留意到这个问题。是要支持新标准的,我查了spring6的发布日期是10月,后续版本要补上,这块你也比较熟悉,能参与进来提交PR么?

jiangqiang1996 commented 2 years ago

收到,感谢告知,我之前还没留意到这个问题。是要支持新标准的,我查了spring6的发布日期是10月,后续版本要补上,这块你也比较熟悉,能参与进来提交PR么?

可以的

wenshao commented 2 years ago

https://github.com/spring-projects/spring-petclinic 能否帮忙增加一个类似上面这样的DEMO子项目

jiangqiang1996 commented 2 years ago

https://github.com/spring-projects/spring-petclinic 能否帮忙增加一个类似上面这样的DEMO子项目

需要引入哪方面的依赖?

jiangqiang1996 commented 2 years ago

https://github.com/spring-projects/spring-petclinic 能否帮忙增加一个类似上面这样的DEMO子项目

可否告知需要测试什么,我才知道需要哪方面的demo

wenshao commented 2 years ago

想测试FastjsonSockJsMessageCodec和FastJsonJsonView

jiangqiang1996 commented 2 years ago

想测试FastjsonSockJsMessageCodec和FastJsonJsonView

FastJsonJsonView在spring5上面运行是没什么问题,之前没使用过websocket,所以FastjsonSockJsMessageCodec我只是引入了能正常启动。spring6最低要求jdk版本为17,所以要想兼容未来,fastjson2项目只能舍弃很多兼容以前老版本的东西。没必要为了兼容老版本引入过多重复的包,导致性能问题。

wenshao commented 2 years ago

能否先修改为spring 5.x的demo,等spring6正式版本之后,我创建一个jdk17的分支,在jdk17的分支上增加spring6的demo。

jiangqiang1996 commented 2 years ago

能否先修改为spring 5.x的demo,等spring6正式版本之后,我创建一个jdk17的分支,在jdk17的分支上增加spring6的demo。

已经推送spring5的demo,完善了websocket的demo

wenshao commented 2 years ago

已经合并并且做了一些调整当做项目的一个module了,怎么启动怎么访问,能写一个readme么?

jiangqiang1996 commented 2 years ago

已经合并并且做了一些调整当做项目的一个module了,怎么启动怎么访问,能写一个readme么?

spring6test这个模块下的代码需要删除么?这个是基于jdk17的

wenshao commented 2 years ago

可以先保留,等jdk17的分支做好了,就启用

你这个demo很棒,我根据这个demo优化了FastJsonHttpMessageConverter的实现,比如 https://github.com/alibaba/fastjson2/issues/755

能帮忙提供例子把 FastJsonJsonView 等其他的类也用起来么?

jiangqiang1996 commented 2 years ago

可以先保留,等jdk17的分支做好了,就启用

你这个demo很棒,我根据这个demo优化了FastJsonHttpMessageConverter的实现,比如 #755

能帮忙提供例子把 FastJsonJsonView 等其他的类也用起来么?

FastJsonJsonView类已经用上了,还有哪些其他类? 貌似没别的了吧?

wenshao commented 2 years ago

FastjsonSockJsMessageCodec 没用到?

jiangqiang1996 commented 2 years ago

FastjsonSockJsMessageCodec 没用到?

WebSocketConfig这个类下用到了 webSocketHandlerRegistry.addHandler(new ChatMessageHandler(), "/websocket/*").withSockJS().setMessageCodec(new FastjsonSockJsMessageCodec());

我也不知道用的对不对,主要是不知道生效没有,之前没用过websocket,但是这么用websocket是正常的。

wyyl1 commented 2 years ago

感谢两位辛勤做贡献

wenshao commented 1 year ago
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2-extension-spring6</artifactId>
    <version>2.0.24</version>
</dependency>

已经支持