返回错误更改方法签名

Posted

技术标签:

【中文标题】返回错误更改方法签名【英文标题】:Returning an error changes method signature 【发布时间】:2022-01-23 23:49:06 【问题描述】:

我从教程中了解到,返回一个可抛出的,不应该改变方法返回类型。

这是我的尝试:

    使用handle时,一切都很好,直到我添加.timeout(),然后函数返回类型更改为Flux<Object>
private Flux<String> exampleHandle()

    MutableHttpRequest<String> req = HttpRequest.GET("http://localhost:8080");

    return httpClient.exchange(req, TokenResponse.class)
        .handle((response, sink) -> 
            Optional<TokenResponse> optionalBody = response.getBody();
            if (optionalBody.isEmpty()) 
                sink.error(new InitializationException("Failed to fetch authentication token. Body is null."));
             else 
                TokenResponse tokenResponse = optionalBody.get();
                String accessToken = tokenResponse.getAccessToken();
                if (accessToken != null) 
                    sink.next(accessToken);
                 else 
                    sink.error(new InitializationException("Failed to fetch authentication token. Authentication token is null."));
                
            
        );
       // .timeout(Duration.ofSeconds(10)); // Timeout changes return type to Flux<Object>

    当使用mapFlux.error时(我也试过Mono.error),当我在map中引入Flux.error时,函数返回类型更改为Flux&lt;Object&gt;
private Flux<String> exampleMap()

    MutableHttpRequest<String> req = HttpRequest.GET("http://localhost:8080");

    return httpClient.exchange(req, TokenResponse.class)
        .map(response -> 
            Optional<TokenResponse> optionalBody = response.getBody();
            if (optionalBody.isEmpty()) 
                return Flux.error(new InitializationException("Failed to fetch authentication token. Body is null."));
             else 
                TokenResponse tokenResponse = optionalBody.get();
                String accessToken = tokenResponse.getAccessToken();
                if (accessToken != null) 
                    return accessToken;
                 else 
                    return Flux.error(new InitializationException("Failed to fetch authentication token. Authentication token is null."));
                
            
        );

谁能解释我做错了什么?谢谢!

【问题讨论】:

如果你的 Flux 超时,那么它就不能返回一个字符串,我猜这就是它变成 Object 的原因。映射时,不应返回容器类型(这就是 flatMap 的用途) 您是否将抛出 Exception 与返回混淆?他们不是一回事。当您从方法返回某些内容时,控制权将传递给调用您的方法。当你扔东西时,控制权被传递给catch 子句,这可能是堆栈的几个步骤。 【参考方案1】:

你应该在handle之前移动timeout

 return httpClient.exchange(req, TokenResponse.class)
        .timeout(Duration.ofSeconds(10))
        .handle((response, sink) -> 

至于map的情况,看一下方法签名:

Flux map(Function<? super T,? extends V> mapper)

map 接受Function&lt;T, U&gt; 并返回Flux&lt;U&gt;,返回Flux.error 无效。您可以简单地在 map 中使用 throw,Reactor 会将其转换为正确的错误信号我认为 handle 更适合这种情况。

有用的链接:

Correct way of throwing exceptions with Reactor map vs flatMap in reactor

【讨论】:

以上是关于返回错误更改方法签名的主要内容,如果未能解决你的问题,请参考以下文章

您可以使用泛型进行方法重载并且只更改方法签名的泛型类型吗?

通用方法签名

如何更改公共方法签名以及都有哪些风险?

Xcode 自定义框架 - 无已知方法错误

查看APK的签名的方法,和应用商店更改签名导致第三方无法登录问题

使用 func<> 委托时,我可以以任何方式更改签名吗?