java.lang.IllegalStateException: Only one connection receive subscriber allowed

 

 

在使用spring-cloud-gateway當作網關服務,當收到post請求,且content-type爲application/x-www-form-urlencoded時,網關服務報如下異常:
2018-10-08 13:11:34.971 ERROR 8304 --- [ctor-http-nio-3] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [POST http://127.0.0.1:8088/demo/login]
 
java.lang.IllegalStateException: Only one connection receive subscriber allowed.
    at reactor.ipc.netty.channel.FluxReceive.startReceiver(FluxReceive.java:279) ~[reactor-netty-0.7.9.RELEASE.jar:0.7.9.RELEASE]
    at reactor.ipc.netty.channel.FluxReceive.lambda$subscribe$2(FluxReceive.java:129) ~[reactor-netty-0.7.9.RELEASE.jar:0.7.9.RELEASE]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
    at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_60]
該異常大概意思是連接中的請求體只能被訂閱一次,也就是說這個請求的body已經被讀取過一次了,然後我從網上查閱各種資料也請教了大神,提供的解決思路都是通過緩存body之後,再重新封裝一次request轉發出去,但是我試過N多遍,並且各種改良,我的接口服務始終接收不到任何參數。無奈,後來在stackoverflow發佈了這個問題,得到了國外大神的指點有兩個解決辦法

 

方法一:

    其實這個問題是在spring-boot-2.0.5這個版本上纔出現的,所以將版本改爲2.0.4即可,如果不想改版本號可參考方法二。

 

方法二:

    使用如下代碼禁用HiddenHttpMethodFilter 過濾器,該過濾器的作用請參考:https://blog.csdn.net/geloin/article/details/7444321

    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new HiddenHttpMethodFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
                return chain.filter(exchange);
            }
        };
    }
 

國外大神關於這個問題的討論帖:https://github.com/spring-cloud/spring-cloud-gateway/issues/541
————————————————
版權聲明:本文爲CSDN博主「哪託的輪滑鞋」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_40420213/article/details/82966550

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章