我是新的Spring WebFlux。我正在编写一个简单的api,它调用另一个api,并返回响应。我遇到的问题是我的api接受不同于外部api的请求类型。我必须将传入的请求转换为外部api。我使用Mono来接收对我的api的请求,但在没有block()的情况下转换为另一个对象时遇到了麻烦。
输入
@Configuration
@EnableWebFlux
public class RouterConfig implements WebFluxConfigurer{
@Bean
public RouterFunction<ServerResponse> routes(UserHandler handler){
return RouterFunctions
.route(POST("/rest/create"),
handler::createUser);
}
}
@Component
public class UserHandler {
private UserService service;
public UserHandler(UserService service) {
this.service = service;
}
public Mono<ServerResponse> saveUser(ServerRequest request)
{
Mono<User> user = request.bodyToMono(User.class)
/* currently I am using block to get User object */
User user1 = user.block()
/* convert user to person */
Person p =getPersonFromUser(user);
}
class User
{
private String name;
private String id;
private String email;
private String phone;
}
class Person
{
private String email;
/* Combination of id and name */
private String accountNumber;
private String phone;
}
有没有一种方法可以把单声道转换成Person对象而不阻塞?
如果您愿意用Mono-Lambda处理Person p,那么您可以尝试
public Mono<ServerResponse> saveUser(ServerRequest request)
{
// Mono<User> user = request.bodyToMono(User.class)
request.bodyToMono(User.class)
// Convert a Mono<User> to a Mono<Person>
.map((User user1) -> getPersonFromUser(user))
.map((Person p) -> {
// Code that either returns ServerResponse object or an intermediary object
})
// Additional code as needed
因为request.bodytomono(User.class)返回一个用户的Mono,所以可以调用该Mono的map方法。map方法接受一个lambda类型函数,该函数接受一种类型的参数并返回一个不同类型的对象。
发出的第一个地图调用:
.map((User user1) -> getPersonFromUser(user))
.map((User user1) -> getPersonFromUser(user))
.flatMap((User user1) -> getPersonFromUser(user))
如果您对map vs flatmap感兴趣,可以查看这个StackOverFlow问题
block()/blockfirst()/blocklast()正在阻塞,线程反应器-http-nio-2不支持这一点 这是正确的方法吗?还有另一种更好的方法来实现这一点?我也在想一些类似的事情:
我正在使用Postman向我的Spring应用程序发送POST请求。请求有一个JSON主体,如下所示: 我有一个方法来处理这些POST请求,我需要能够从请求主体中提取上述JSON数据而不会阻塞。我现在的方法看起来像这样: 然而,这没有任何作用。我尝试使用ServerRequest查看Spring中的答案,并从Spring ServerRequest中获取字符串体,但没有成功。请帮忙。 更新#1 谢
getUserDetails方法返回JsonNode类型的Mono。但我真的想退货 但是来自Url的json响应类似于 我尝试了不同的方法,但都不管用。doOnNext(分别为-
好吧,所以我有下面的方法,但我试图摆脱使用。块(),因此尝试实现Mono,但得到错误< code >所需的类型:List 原始代码 我尝试以非阻塞方式重构使用 Mono
我尝试使处理程序和路由器类的Spring引导webflow。模型类是用户类。代码是 下面是webflux项目的处理程序类。在register方法中,我编写了id复制测试代码。但这是完全错误的。 我想提取的用户名或id字符串从Mono的Spring webflow.将需要任何评论。我被这部分卡住了。
我很难理解mono 的用法。请问这个Mono 能给Mono带来什么样的好处? 谢谢。