SpringWebflux(基于函数式编程模型)
(1)在使用函数式编程模型操作时候,需要自己初始化服务器
(2)基于函数式编程模型时候,有两个核心接口:RouterFunction(实现路由功能,请求转发给对应的handler)和HandlerFunction(处理请求生成响应的函数)。核心任务定义两个函数式接口的实现并且启动需要的服务器。
(3)SpringWebflux请求和响应不再是ServletRequest和ServletResponse,而是ServerRequest ServerResponse
第一步:把注解编程模型工程复制一份,保留entity和service内容
第二步:创建Handler(具体实现方法)
public class Userhandler {
private final UserService userService;
public Userhandler(UserService userService){
this.userService = userService;
}
//根据id查询
public Mono<ServerResponse> getUserById(ServerRequest request){
//获取id值
Integer id = Integer.valueOf(request.pathVariable("id"));
//空值处理
Mono<ServerResponse> notFound = ServerResponse.notFound().build();
//调用sever方法得到数据
Mono<User> userMono = this.userService.getUserById(id);
//把 userMono 进行转换返回--其中一种写法,可以用下面查询所有写法
//使用 Reactor操作符 flatMap
return userMono.flatMap(person ->
ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
.body(fromObject(person))
).switchIfEmpty(notFound);
}
//查询所有
public Mono<ServerResponse> getAll(ServerRequest request){
//调用sevice得到结果
Flux<User> users = this.userService.getAll();
return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(users,User.class);
}
//添加
public Mono<ServerResponse> saveUser(ServerRequest request){
//得到user对象
Mono<User> userMono = request.bodyToMono(User.class);
return ServerResponse.ok().build(this.userService.saveUser(userMono));
}
}
第三步:初始化服务器,编写Router
创建路由的方法
//1 创建 Router 路由
public RouterFunction<ServerResponse> routerFunction(){
UserService userService = new UserServiceImpl();
Userhandler userhandler = new Userhandler(userService);
//设置路由
return RouterFunctions.route(
GET("/user/{id}").and(accept(APPLICATION_JSON)),userhandler::getUserById)
.andRoute(GET("/users").and(accept(APPLICATION_JSON)),userhandler::getAll);
}
创建服务器完成适配
//2 创建服务器 完成适配
public void createReactorServer(){
//路由和handler适配
RouterFunction<ServerResponse> router = routerFunction();
HttpHandler httpHandler = toHttpHandler(router);
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);
//创建服务器
HttpServer httpServer = HttpServer.create();
httpServer.handle(adapter).bindNow();
}
最终调用
public static void main(String[] args) throws Exception{
Server server = new Server();
server.createReactorServer();
System.out.println("enter to exit");
System.in.read();
}
(4)使用WebClient调用
public class Client {
public static void main(String[] args) {
//调用服务器地址
WebClient webClient = WebClient.create("http://127.0.0.1:51879");
//根据id查询
String id = "1";
User user = webClient.get().uri("/user/{id}", id)
.accept(MediaType.APPLICATION_JSON).retrieve()
.bodyToMono(User.class).block();
System.out.println(user.getName());
//查询所有
Flux<User> userFlux = webClient.get().uri("/users")
.accept(MediaType.APPLICATION_JSON).retrieve()
.bodyToFlux(User.class);
userFlux.map(stu -> stu.getName()).buffer().doOnNext(System.out::println).blockFirst();
}
}