webflux使用r2dbc采用RouterFunction方式

该代码示例展示了如何在SpringWebFlux中使用RouterFunction来处理HTTP请求。PersonHandler类包含了对人员列表的查询、添加、更新和删除操作,而RouterConfig类配置了路由规则,将请求映射到相应的处理器方法。

采用RouterFunction

package com.example.demo.handlers;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import com.example.demo.dao.PersonDao;
import com.example.demo.entity.Person;
import reactor.core.publisher.Mono;
@Component
public class PersonHandler {
	private PersonDao personDao;

	public PersonHandler(PersonDao personDao) {
		this.personDao = personDao;
	}
	
	/**
	 * 
	 * @param request
	 * @return
	 */
	public Mono<ServerResponse> list(ServerRequest request) {
		return ServerResponse.ok()
				.contentType(MediaType.APPLICATION_JSON)
				.body(personDao.findAll(), Person.class);
	}
	
	
	/**
	 * 
	 * @param request
	 * @return
	 */
	public Mono<ServerResponse> add(ServerRequest request) {
		Mono<Person> person = request.bodyToMono(Person.class);
		return ServerResponse.ok()
				.contentType(MediaType.APPLICATION_JSON)
				.body(personDao.saveAll(person),Person.class);
	}
	
	/**
	 * 
	 * @param request
	 * @return
	 */
	public Mono<ServerResponse> update(ServerRequest request) {
		Mono<Person> person = request.bodyToMono(Person.class);		
		return person.flatMap(p->{
			return personDao.findById(p.getId())
			.flatMap(pp->{				
				pp.setAge(p.getAge());
				pp.setBirth(p.getBirth());
				pp.setName(p.getName());
				return personDao.save(pp);
			});
		}).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).build())
		.switchIfEmpty(ServerResponse.notFound().build());

	}
	
	public Mono<ServerResponse> updateOK(ServerRequest request) {
		Mono<Person> person = request.bodyToMono(Person.class);
		
		return person.flatMap(p->{
			return personDao.findById(p.getId())
			.flatMap(pp->{				
				pp.setAge(p.getAge());
				pp.setBirth(p.getBirth());
				pp.setName(p.getName());
				return personDao.save(pp);
			});
		}).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).build())
		.switchIfEmpty(ServerResponse.notFound().build());

	}
	
	/**
	 * 通过id获取person
	 * @param request
	 * @return
	 */
	public Mono<ServerResponse> id(ServerRequest request) {
		Long id = new Long(request.pathVariable("id"));
		return ServerResponse.ok()
				.contentType(MediaType.APPLICATION_JSON)
				.body(personDao.findById(id),
				Person.class);
	}
	
	/**
	 * 
	 * @param request
	 * @return
	 */
	public Mono<ServerResponse> deleteById(ServerRequest request) {
		Long id = new Long(request.pathVariable("id"));
		return personDao.findById(id)
				.flatMap(p -> personDao.delete(p))
				.then(ServerResponse.ok().build())
				.switchIfEmpty(ServerResponse.notFound().build());
	}

}

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import com.example.demo.handlers.PersonHandler;

@Component
public class RouterConfig {
	
	
	@Bean
	RouterFunction<ServerResponse> router(PersonHandler handler){
		return RouterFunctions.nest(RequestPredicates.path("/pp"),
				RouterFunctions.route(RequestPredicates.GET("/list"), handler::list)
				.andRoute(RequestPredicates.POST("/add").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), handler::add)
				.andRoute(RequestPredicates.POST("/update").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), handler::update)
				.andRoute(RequestPredicates.GET("/id/{id}"), handler::id)
				.andRoute(RequestPredicates.GET("/delete/{id}"), handler::deleteById)
				);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值