Closed CoderYellow closed 2 years ago
这地方好奇怪啊,用的版本明明有在这个属性,加载到虚拟机后又没有,会不会是Java 17兼容性问题,要不用Jdk 17 release一个版本试试
原来是这个WellKnownMimeType被重定义了, 不知道为什么加载了rsocket-core原来的那个,没有加载这个
这问题通过spring依赖的rsocket-core exclude掉可以解决,但不知道为什么要这样重定义来override,不可以声明一个自己包命名空间的枚举吗。 jvm在classpath上找到两个同名的class,好像不一定加载你重定义的那个。
这个主要是由于RSocket Java中的WellKnownMimeType为enum类型,这个是没法被扩展的,所以只能做Class覆盖。事实上这个问题在企业内部开发也是经常需要的,https://github.com/rsocket/rsocket/blob/master/Extensions/WellKnownMimeTypes.md 上列出的已知类型无法覆盖到企业内部的一些特定类型需求,所以会存在class覆盖的问题。
考虑到Java类的加载机制,只要保证alibaba-rsocket-core依赖声明在先即可。 如果你公司也有不同的数据类型,也可以考虑同样的机制。 为何要选择这样的机制? 我使用content-type的字符串变量也是可以的,为何要添加到WellKnownMimeType中? 如果是字符串变量,会传输更多的字节,而在WellKnownMimeType中的类型,则是一个byte,如果每一个请求都要包括content-type的字符串值,这个会影响一定的性能。
Describe the bug 之前说过srping 最新版支持
@RSocketExchange
,我就想跑个demo试试,spring 6 最低支持Java 17 Java 17 运行报Caused by: java.lang.NoSuchFieldError: MESSAGE_RSOCKET_APPLICATION
Environment
Steps to reproduce this issue
run the demo
Expected Result
What do you expected from the above steps?
Actual Result
What actually happens?
If there is an exception, please attach the exception trace: