Spring WebFlux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

// request 来,response出,所以不需要返回值 => Mono<Void>
public interface WebHandler {
Mono<Void> handle(ServerWebExchange exchange);
}

public interface ServerWebExchange {
ServerHttpRequest getRequest();

ServerHttpResponse getResponse();
}



每一个路径对应一个 handler
"/user" => user handler
"/order" => order handler

Mono<Handler> handler = getHandler(path);
Handler 可能有很多种,可以设置为 Object,使用的时候再强转就可以了,
路径可以从 exchange 中获取到,

public interface HandlerMapping {
Mono<Object> getHandler(ServerWebExchange exchange);
}





public class DispatcherHandler implements WebHandler, PreFlightRequestHandler, ApplicationContextAware {
@Override
public Mono<Void> handle(ServerWebExchange exchange) {// ...省略部分代码
return Flux.fromIterable(this.handlerMappings)
.concatMap(mapping -> mapping.getHandler(exchange))// 获取 handler => 可能有多个,下面 next() 取第一个
.next()
.switchIfEmpty(createNotFoundError())
.flatMap(handler -> invokeHandler(exchange, handler))
.flatMap(result -> handleResult(exchange, result));
}

private Mono<HandlerResult> invokeHandler(ServerWebExchange exchange, Object handler) {// ...省略部分代码
for (HandlerAdapter handlerAdapter : this.handlerAdapters) {
if (handlerAdapter.supports(handler)) {
return handlerAdapter.handle(exchange, handler);
}
}
return Mono.error(new IllegalStateException("No HandlerAdapter: " + handler));
}
}


// HandlerFunction => 如下
// @Configuration
// public class RouterConfiguration {
// @Bean
// RouterFunction<ServerResponse> userRouterFunction(UserHandler userHandler) {
// return RouterFunctions.nest(RequestPredicates.path("/user"),
// RouterFunctions.route(RequestPredicates.GET("/getAllUser"), userHandler::getAllUsers)
// .andRoute(RequestPredicates.POST("/addUser"), userHandler::addUser)
// .andRoute(RequestPredicates.DELETE("/{userId}"), userHandler::deleteUser));
// }
// }
public class HandlerFunctionAdapter implements HandlerAdapter {

@Override
public boolean supports(Object handler) {
return handler instanceof HandlerFunction;
}

@Override
public Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler) {
// ...省略
}
}


// @RequestMapping => 如下
// @RestController
// @RequestMapping("/user")
// public class UserController {
// @Autowired
// private UserRepository userRepository;
//
// @RequestMapping("/getAllUser")
// public Flux<User> getAllUser() {
// Flux<User> userFlux = userRepository.findAll();
// return userFlux;
// }
//
// @RequestMapping("/addUser")
// public Mono<User> addUser(User user) {
// Mono<User> mono = userRepository.save(user);
// return mono;
// }
// }
public class RequestMappingHandlerAdapter implements HandlerAdapter, ApplicationContextAware, InitializingBean {

@Override
public boolean supports(Object handler) {
return handler instanceof HandlerMethod;
}

@Override
public Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler) {
// ...省略
}
}