首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支持通过Spring网关代理SOAP/XML终结点

支持通过Spring网关代理SOAP/XML终结点
EN

Stack Overflow用户
提问于 2019-02-20 12:33:40
回答 1查看 1.4K关注 0票数 3

尝试记录请求和响应,同时使用Spring云网关代理soap服务。下面是代码片段..。就是扔IllegalStateException。

java.lang.IllegalStateException:只允许一个连接接收订户。在reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:271)反应器-netty-0.8.4 RELEASE.jar:0.8.4 reactor在reactor.netty.channel.FluxReceive.subscribe(FluxReceive.java:121)反应器-netty-0.8.4 reactor:0.8.4 reactor

代码语言:javascript
复制
--- Spring Versions ---

SpringBoot                  : 2.1.2.RELEASE
spring-cloud-gateway        : 2.1.1.BUILD-SNAPSHOT
spring-boot-starter-webflux : 2.1.2.RELEASE
reactor-core                : 3.2.5.RELEASE

GatewaySampleApplication

代码语言:javascript
复制
public class  GatewaySampleApplication {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes() 
.route(
r ->
r.path("/security/getToken")
.filters( f -> f.preserveHostHeader()
.filter(new PolicyHandlerReactive()))
.uri("http://targetendpoint.xyz.com")
)
.build();
}
}

PolicyHandlerReactive :

代码语言:javascript
复制
PolicyHandlerReactive implements GatewayFilter  {

@Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) 
    {
        ServerHttpRequest request = (ServerHttpRequest) exchange.getRequest();
                Flux<DataBuffer> xmlReqFlux = request.getBody();    
                Mono<List<DataBuffer>> monoDataList = xmlReqFlux.collectList();
                monoDataList.map(dataA -> logRequest2(dataA)).subscribe();
        return chain.filter(exchange);
        }
}
代码语言:javascript
复制
private List<DataBuffer> logRequest(List<DataBuffer> dataA) {           

    ListIterator<DataBuffer> dataAList = dataA.listIterator();

    while(dataAList.hasNext() ) {
        DataBuffer dataBuffer = dataAList.next();
        InputStream is = dataBuffer.asInputStream();
        System.out.println(convertStreamToString(is));
    }       
    return dataA;
}   
EN

回答 1

Stack Overflow用户

发布于 2019-02-20 15:36:30

能够用.modifyRequestBody而不是过滤器来解决这个问题.下面更新的java DSL ..。

代码语言:javascript
复制
    .route(
                    r ->
                    r.path("external/v2/security/")
                    .filters( f -> f
                            .preserveHostHeader()
                            .modifyRequestBody(String.class, String.class, 
                            (exchange, s) -> {
                                Mono<String> dataA = Mono.just(s); 
                                dataA.subscribe(System.out::print); 
                                return dataA; 
                            })                              
                         )                                                                                               
                    .uri("http://targetendpoint.xyz.com")
                    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54786497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档