halo-dev / halo

强大易用的开源建站工具。
https://www.halo.run
GNU General Public License v3.0
32.47k stars 9.45k forks source link

ReactiveExtensionClient的listAll方法兼容sort为null的情况 #6219

Closed longjuan closed 4 days ago

longjuan commented 5 days ago

系统信息

使用的哪种方式运行?

Source Code

发生了什么?

https://github.com/halo-dev/halo/blob/9410006659e08367f66c03d60e60a7e817ea91b8/application/src/main/java/run/halo/app/extension/ReactiveExtensionClientImpl.java#L114 s3插件调用listAll方法时,sort参数传的时null,在旧版本halo中时可以运行的,2.17不行了。 虽然可以通过修改s3代码实现兼容新版本,但是不确定其他插件是否有这种写法。 希望希望能兼容此类情形,同时对其他接口进行排查。

相关日志输出

java.lang.NullPointerException: Cannot invoke "org.springframework.data.domain.Sort.iterator()" because "sort" is null
    at run.halo.app.extension.index.IndexedQueryEngineImpl.getFieldNamesUsedInListOptions(IndexedQueryEngineImpl.java:150) ~[main/:na]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    *__checkpoint ⇢ Handler run.halo.s3os.S3LinkController#listObjects(String, String, String, Integer, Boolean, String) [DispatcherHandler]
    *__checkpoint ⇢ run.halo.app.console.ProxyFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ run.halo.app.console.ProxyFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ run.halo.app.security.InitializeRedirectionWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ run.halo.app.security.device.DeviceSessionFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ AuthorizationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ ExceptionTranslationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ LogoutWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ ServerRequestCacheWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ LogoutPageGeneratingWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ AnonymousAuthenticationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
    *__checkpoint ⇢ TotpAuthenticationFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ AuthenticationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
    *__checkpoint ⇢ RememberMeAuthenticationFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ SecurityWebFilterChainProxy [DefaultWebFilterChain]
    *__checkpoint ⇢ AuthenticationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ AuthenticationWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ ReactorContextWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ CsrfWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ CorsWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ HttpHeaderWriterWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
    *__checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
    *__checkpoint ⇢ run.halo.app.webfilter.AdditionalWebFilterChainProxy [DefaultWebFilterChain]
    *__checkpoint ⇢ HTTP GET "/apis/s3os.halo.run/v1alpha1/objects/attachment-policy-nYTgM?continuationToken=&continuationObject=&pageSize=50&filePrefix=" [ExceptionHandlingWebHandler]
Original Stack Trace:
        at run.halo.app.extension.index.IndexedQueryEngineImpl.getFieldNamesUsedInListOptions(IndexedQueryEngineImpl.java:150) ~[main/:na]
        at run.halo.app.extension.index.IndexedQueryEngineImpl.doRetrieve(IndexedQueryEngineImpl.java:113) ~[main/:na]
        at run.halo.app.extension.index.IndexedQueryEngineImpl.retrieveAll(IndexedQueryEngineImpl.java:55) ~[main/:na]
        at run.halo.app.extension.ReactiveExtensionClientImpl.lambda$listAll$2(ReactiveExtensionClientImpl.java:117) ~[main/:na]
        at reactor.core.publisher.MonoSupplier$MonoSupplierSubscription.request(MonoSupplier.java:126) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onSubscribe(MonoFlatMapMany.java:141) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:152) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoSupplier.subscribe(MonoSupplier.java:48) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.Mono.subscribe(Mono.java:4568) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.MonoUsing$MonoUsingSubscriber.onNext(MonoUsing.java:231) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.publisher.FluxSubscribeOnCallable$CallableSubscribeOnSubscription.run(FluxSubscribeOnCallable.java:252) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68) ~[reactor-core-3.6.7.jar:3.6.7]
        at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28) ~[reactor-core-3.6.7.jar:3.6.7]
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
        at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

附加信息

image

chengzhongxue commented 5 days ago

要给 sort参数 不然就会有这个问题,我写的插件也出现了这个问题

guqing commented 5 days ago

这个client这里的sort参数应该是一直不支持null的,使用 Sort.unsort方法代替,只有以前的Comparator可以为null,也不建议对所有Sort类型的参数传递null

longjuan commented 5 days ago

image

https://github.com/halo-dev/plugin-s3/blob/bdd62cbe1211e5f78c10ebb169d650c26babd68c/src/main/java/run/halo/s3os/S3LinkServiceImpl.java#L93

以前传null时可以运行的,要评估这个改动对所有插件的影响,s3我就先改成unsorted吧

guqing commented 4 days ago

以前传null时可以运行的,要评估这个改动对所有插件的影响,s3我就先改成unsorted吧

抱歉,我知道是哪里的原因了,以前 listAll 方法是复用的 listBy 的逻辑因此 listAll 方法恰巧因为 withSort 的默认值可以传 null,我将先兼容这种情况以给开发者适应的时间

JohnNiang commented 4 days ago

/kind bug /area core /milestone 2.17.x