erdengk opened a new issue #2992: URL: https://github.com/apache/incubator-shenyu/issues/2992
### Is there an existing issue for this? - [X] I have searched the existing issues ### Current Behavior I've found some issues while writing integration tests for the hystrix plugin. This is one of them. In shenyu's code, hystrix needs to configure all parameters. If there are parameters that are not configured, the background will report a java.lang.NullPointerException: null error. ### Expected Behavior The front-end should verify that all parameters that need to be filled in have been filled in before running the user submission. The backend should also verify that the parameter cannot be empty.  ### Steps To Reproduce run shenyu-admin and shenyu-bootstrap 1. Open the hystrix plugin 2. Add SelectorList (just add it, this step is not the most important)  4. Add rules 5. Do not fill in the parameters in the box. The current version allows such submitted rules.  6. run http://localhost:9195/http/test/waf/pass  ### Environment ```markdown ShenYu version(s):2.4.2 ``` ### Debug logs The most important log should be this part ```json "methodName": "requireNonNull", "fileName": "Objects.java", "lineNumber": 203, "className": "java.util.Objects", "nativeMethod": false }, { "methodName": "doExecute", "fileName": "HystrixPlugin.java", "lineNumber": 58, "className": "org.apache.shenyu.plugin.hystrix.HystrixPlugin", "nativeMethod": false }, ``` Here is the full log ```json { "code": 500, "message": "Internal Server Error", "data": { "cause": null, "stackTrace": [ { "methodName": "requireNonNull", "fileName": "Objects.java", "lineNumber": 203, "className": "java.util.Objects", "nativeMethod": false } ], "message": null, "localizedMessage": null, "suppressed": [ { "cause": null, "stackTrace": [ { "methodName": "requireNonNull", "fileName": "Objects.java", "lineNumber": 203, "className": "java.util.Objects", "nativeMethod": false }, { "methodName": "doExecute", "fileName": "HystrixPlugin.java", "lineNumber": 58, "className": "org.apache.shenyu.plugin.hystrix.HystrixPlugin", "nativeMethod": false }, { "methodName": "execute", "fileName": "AbstractShenyuPlugin.java", "lineNumber": 93, "className": "org.apache.shenyu.plugin.base.AbstractShenyuPlugin", "nativeMethod": false }, { "methodName": "lambda$execute$0", "fileName": "ShenyuWebHandler.java", "lineNumber": 170, "className": "org.apache.shenyu.web.handler.ShenyuWebHandler$DefaultShenyuPluginChain", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 44, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "Mono.java", "lineNumber": 4105, "className": "reactor.core.publisher.Mono", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxSwitchIfEmpty.java", "lineNumber": 75, "className": "reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "MonoFlatMap.java", "lineNumber": 141, "className": "reactor.core.publisher.MonoFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxSwitchIfEmpty.java", "lineNumber": 67, "className": "reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxFilter.java", "lineNumber": 107, "className": "reactor.core.publisher.FluxFilter$FilterSubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxDefaultIfEmpty.java", "lineNumber": 92, "className": "reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "MonoNext.java", "lineNumber": 76, "className": "reactor.core.publisher.MonoNext$NextSubscriber", "nativeMethod": false }, { "methodName": "innerNext", "fileName": "FluxConcatMap.java", "lineNumber": 274, "className": "reactor.core.publisher.FluxConcatMap$ConcatMapImmediate", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxConcatMap.java", "lineNumber": 851, "className": "reactor.core.publisher.FluxConcatMap$ConcatMapInner", "nativeMethod": false }, { "methodName": "complete", "fileName": "Operators.java", "lineNumber": 1630, "className": "reactor.core.publisher.Operators$MonoSubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "MonoFlatMap.java", "lineNumber": 144, "className": "reactor.core.publisher.MonoFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxMapFuseable.java", "lineNumber": 121, "className": "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxFilterFuseable.java", "lineNumber": 112, "className": "reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber", "nativeMethod": false }, { "methodName": "request", "fileName": "Operators.java", "lineNumber": 2186, "className": "reactor.core.publisher.Operators$ScalarSubscription", "nativeMethod": false }, { "methodName": "request", "fileName": "FluxFilterFuseable.java", "lineNumber": 184, "className": "reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber", "nativeMethod": false }, { "methodName": "request", "fileName": "FluxMapFuseable.java", "lineNumber": 162, "className": "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber", "nativeMethod": false }, { "methodName": "onSubscribe", "fileName": "MonoFlatMap.java", "lineNumber": 103, "className": "reactor.core.publisher.MonoFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "onSubscribe", "fileName": "FluxMapFuseable.java", "lineNumber": 90, "className": "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber", "nativeMethod": false }, { "methodName": "onSubscribe", "fileName": "FluxFilterFuseable.java", "lineNumber": 81, "className": "reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoJust.java", "lineNumber": 54, "className": "reactor.core.publisher.MonoJust", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "Mono.java", "lineNumber": 4105, "className": "reactor.core.publisher.Mono", "nativeMethod": false }, { "methodName": "drain", "fileName": "FluxConcatMap.java", "lineNumber": 441, "className": "reactor.core.publisher.FluxConcatMap$ConcatMapImmediate", "nativeMethod": false }, { "methodName": "onSubscribe", "fileName": "FluxConcatMap.java", "lineNumber": 211, "className": "reactor.core.publisher.FluxConcatMap$ConcatMapImmediate", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "FluxIterable.java", "lineNumber": 139, "className": "reactor.core.publisher.FluxIterable", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "FluxIterable.java", "lineNumber": 63, "className": "reactor.core.publisher.FluxIterable", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "Mono.java", "lineNumber": 4105, "className": "reactor.core.publisher.Mono", "nativeMethod": false }, { "methodName": "drain", "fileName": "MonoIgnoreThen.java", "lineNumber": 172, "className": "reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoIgnoreThen.java", "lineNumber": 56, "className": "reactor.core.publisher.MonoIgnoreThen", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "Mono.java", "lineNumber": 4105, "className": "reactor.core.publisher.Mono", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxSwitchIfEmpty.java", "lineNumber": 75, "className": "reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxFilter.java", "lineNumber": 160, "className": "reactor.core.publisher.FluxFilter$FilterSubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxSwitchIfEmpty.java", "lineNumber": 78, "className": "reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber", "nativeMethod": false }, { "methodName": "request", "fileName": "Operators.java", "lineNumber": 2188, "className": "reactor.core.publisher.Operators$ScalarSubscription", "nativeMethod": false }, { "methodName": "set", "fileName": "Operators.java", "lineNumber": 1994, "className": "reactor.core.publisher.Operators$MultiSubscriptionSubscriber", "nativeMethod": false }, { "methodName": "onSubscribe", "fileName": "Operators.java", "lineNumber": 1868, "className": "reactor.core.publisher.Operators$MultiSubscriptionSubscriber", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoJust.java", "lineNumber": 54, "className": "reactor.core.publisher.MonoJust", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "Mono.java", "lineNumber": 4105, "className": "reactor.core.publisher.Mono", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxSwitchIfEmpty.java", "lineNumber": 75, "className": "reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "MonoNext.java", "lineNumber": 96, "className": "reactor.core.publisher.MonoNext$NextSubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxFilter.java", "lineNumber": 160, "className": "reactor.core.publisher.FluxFilter$FilterSubscriber", "nativeMethod": false }, { "methodName": "checkTerminated", "fileName": "FluxFlatMap.java", "lineNumber": 823, "className": "reactor.core.publisher.FluxFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "drainLoop", "fileName": "FluxFlatMap.java", "lineNumber": 589, "className": "reactor.core.publisher.FluxFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "drain", "fileName": "FluxFlatMap.java", "lineNumber": 569, "className": "reactor.core.publisher.FluxFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxFlatMap.java", "lineNumber": 455, "className": "reactor.core.publisher.FluxFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "slowPath", "fileName": "FluxIterable.java", "lineNumber": 265, "className": "reactor.core.publisher.FluxIterable$IterableSubscription", "nativeMethod": false }, { "methodName": "request", "fileName": "FluxIterable.java", "lineNumber": 201, "className": "reactor.core.publisher.FluxIterable$IterableSubscription", "nativeMethod": false }, { "methodName": "onSubscribe", "fileName": "FluxFlatMap.java", "lineNumber": 363, "className": "reactor.core.publisher.FluxFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "FluxIterable.java", "lineNumber": 139, "className": "reactor.core.publisher.FluxIterable", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "FluxIterable.java", "lineNumber": 63, "className": "reactor.core.publisher.FluxIterable", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "InternalMonoOperator.java", "lineNumber": 55, "className": "reactor.core.publisher.InternalMonoOperator", "nativeMethod": false }, { "methodName": "subscribe", "fileName": "MonoDefer.java", "lineNumber": 52, "className": "reactor.core.publisher.MonoDefer", "nativeMethod": false }, { "methodName": "onNext", "fileName": "MonoFlatMap.java", "lineNumber": 150, "className": "reactor.core.publisher.MonoFlatMap$FlatMapMain", "nativeMethod": false }, { "methodName": "complete", "fileName": "Operators.java", "lineNumber": 1630, "className": "reactor.core.publisher.Operators$MonoSubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxDefaultIfEmpty.java", "lineNumber": 100, "className": "reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxMap.java", "lineNumber": 136, "className": "reactor.core.publisher.FluxMap$MapSubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxMap.java", "lineNumber": 136, "className": "reactor.core.publisher.FluxMap$MapSubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxFilter.java", "lineNumber": 160, "className": "reactor.core.publisher.FluxFilter$FilterSubscriber", "nativeMethod": false }, { "methodName": "onComplete", "fileName": "FluxMap.java", "lineNumber": 262, "className": "reactor.core.publisher.FluxMap$MapConditionalSubscriber", "nativeMethod": false }, { "methodName": "complete", "fileName": "Operators.java", "lineNumber": 1631, "className": "reactor.core.publisher.Operators$MonoSubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "MonoProcessor.java", "lineNumber": 317, "className": "reactor.core.publisher.MonoProcessor", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxPeek.java", "lineNumber": 192, "className": "reactor.core.publisher.FluxPeek$PeekSubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxSwitchIfEmpty.java", "lineNumber": 67, "className": "reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber", "nativeMethod": false }, { "methodName": "onNext", "fileName": "FluxMapFuseable.java", "lineNumber": 121, "className": "reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber", "nativeMethod": false }, { "methodName": "run", "fileName": "FluxSubscribeOnCallable.java", "lineNumber": 249, "className": "reactor.core.publisher.FluxSubscribeOnCallable$CallableSubscribeOnSubscription", "nativeMethod": false }, { "methodName": "call", "fileName": "SchedulerTask.java", "lineNumber": 68, "className": "reactor.core.scheduler.SchedulerTask", "nativeMethod": false }, { "methodName": "call", "fileName": "SchedulerTask.java", "lineNumber": 28, "className": "reactor.core.scheduler.SchedulerTask", "nativeMethod": false }, { "methodName": "run", "fileName": "FutureTask.java", "lineNumber": 266, "className": "java.util.concurrent.FutureTask", "nativeMethod": false }, { "methodName": "access$201", "fileName": "ScheduledThreadPoolExecutor.java", "lineNumber": 180, "className": "java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask", "nativeMethod": false }, { "methodName": "run", "fileName": "ScheduledThreadPoolExecutor.java", "lineNumber": 293, "className": "java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask", "nativeMethod": false }, { "methodName": "runWorker", "fileName": "ThreadPoolExecutor.java", "lineNumber": 1149, "className": "java.util.concurrent.ThreadPoolExecutor", "nativeMethod": false }, { "methodName": "run", "fileName": "ThreadPoolExecutor.java", "lineNumber": 624, "className": "java.util.concurrent.ThreadPoolExecutor$Worker", "nativeMethod": false }, { "methodName": "run", "fileName": "Thread.java", "lineNumber": 748, "className": "java.lang.Thread", "nativeMethod": false } ], "message": "\nError has been observed at the following site(s):\n\t|_ checkpoint ⇢ org.apache.shenyu.web.configuration.ErrorHandlerConfiguration$1 [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.FallbackFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.FileSizeFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.bootstrap.filter.HealthFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.CrossFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.savedrequest.S erverRequestCacheWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.LocalDispatcherFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ HTTP POST \"/http/test/waf/pass\" [ExceptionHandlingWebHandler]\nStack trace:", "localizedMessage": "\nError has been observed at the following site(s):\n\t|_ checkpoint ⇢ org.apache.shenyu.web.configuration.ErrorHandlerConfiguration$1 [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.FallbackFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.FileSizeFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.bootstrap.filter.HealthFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.CrossFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.saved request.ServerRequestCacheWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.apache.shenyu.web.filter.LocalDispatcherFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]\n\t|_ checkpoint ⇢ HTTP POST \"/http/test/waf/pass\" [ExceptionHandlingWebHandler]\nStack trace:", "suppressed": [] } ] } } ``` ### Anything else? I think this bug needs to be fixed on both frontend and backend. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
