我是新的 Spring Webflux。我正在编写一个简单的 api,它调用另一个 api 并返回响应。
我遇到的问题是我的 api 接受的请求类型与外部 api 不同。我必须将传入的请求转换为发送到外部 api。我正在使用 Mono 来接收对我的 api 的请求,但是在没有转换到另一个对象时遇到了麻烦堵塞()。
输入
路由器
@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);
}
Pojos 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;
}
有没有办法可以将 Mono 转换为 人 对象没有阻塞?
最佳答案
如果您愿意在 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 方法接受类型为 Function 的 lambda它接受一种类型的参数并返回不同类型的对象。第一次 map 调用:
.map((User user1) -> getPersonFromUser(user))
给出了一个 Lambda,它接受一个将用户转换为人的函数,因此我从“用户的单声道”跳到了“人的单声道”。我不知道是否有办法直接从 Person 获取 ServerResponse,但是在第二个 map 调用中,您可以编写函数来返回 ServerResponse(在这种情况下,您有一个“Mono of a ServerResponse”并且您是基本完成)或返回另一个中间对象。如果您选择后者,您可能需要额外的映射调用。
注意:如果在你的 Lambda 中,你得到一个 Mono,你会想要使用 flatMap 方法,即如果 getPersonFromUser(user) 返回一个人的 Mono 而不是一个人,那么代替
.map((User user1) -> getPersonFromUser(user))
你会用.flatMap((User user1) -> getPersonFromUser(user))
您可以查看此 StackOverFlow Question如果你对 map 和平面 map 感兴趣
关于java - Spring-Webflux:在没有 block() 的情况下从 Mono 中提取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63106428/