【问题标题】:Return a String value when method return type is Mono<String>当方法返回类型为 Mono<String> 时返回 String 值
【发布时间】:2021-11-25 21:24:43
【问题描述】:

我的方法将Mono&lt;String&gt; 响应返回给控制器。但是,我在尝试返回 String 值时收到以下 error

Required Type: Mono<String>, 
Provided: Mono<Object>
no instance(s) of type variable(s) T exist so that Mono<T> conforms to String inference variable R has incompatible bounds: equality constraints

服务:

public Mono<String> moveToDB(String pid, String op, MoveRequest moveRequest) {
        return Mono.just(pid)
                .subscribeOn(Schedulers.boundedElastic())
                .map(id -> persistenceService.withTransaction((s, em) -> {
                     //some code goes here
                    if (condition)
                       return "data sync failed"; //ERROR
                    return "data synced successfully"; //ERROR
        }));
}

我是响应式编程的新手,我可能犯了一个愚蠢的错误,但我希望能得到一些帮助。谢谢!

【问题讨论】:

  • Reactive 确实很难学!如果不对代码有更深入的了解,就很难说清楚。但我想说问题出在.withTransaction 部分。也许你可以把它分成另一个.map()withTransaction 实际上是什么?它接受和返回什么?
  • withTransaction() 是另一个服务中用于将对象持久保存到数据库的方法。它接受一个 lambda 函数并返回一个 &lt;T&gt;

标签: java lambda functional-programming reactive-programming project-reactor


【解决方案1】:

我猜withTransaction() 方法不会返回应有的String。您应该将返回值映射到String

.map(id -> service.withTransaction((s, em) -> {
    //some code goes here
    if (true)
        return "data sync failed";
    return "data synced successfully";
}))
.map(e -> e.toString()); //or whatever

【讨论】:

  • 如果您确定 withTransaction 返回一个String 但正在与类型系统作斗争,Flux#cast(String.class) 也可能是一个选项
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多