diff --git a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/controller/CityRestController.java b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/controller/CityRestController.java deleted file mode 100644 index ff495b6..0000000 --- a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/controller/CityRestController.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.spring.springboot.controller; - -import org.spring.springboot.domain.City; -import org.spring.springboot.service.CityService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -/** - * 城市 Controller 实现 Restful HTTP 服务 - *

- * Created by bysocket on 09/29/2017. - */ -@RestController -@RequestMapping(value = "/city") -public class CityRestController { - - @Autowired - private CityService cityService; - - @RequestMapping(value = "/{id}", method = RequestMethod.GET) - public Mono findOneCity(@PathVariable("id") Long id) { - return Mono.create(cityMonoSink -> cityMonoSink.success(cityService.findCityById(id))); - } - - @RequestMapping(method = RequestMethod.GET) - public Flux findAllCity() { - return Flux.create(cityFluxSink -> { - cityService.findAllCity().forEach(city -> { - cityFluxSink.next(city); - }); - cityFluxSink.complete(); - }); - } - - @RequestMapping(method = RequestMethod.POST) - public Mono createCity(@RequestBody City city) { - return Mono.create(cityMonoSink -> cityMonoSink.success(cityService.saveCity(city))); - } - - @RequestMapping(method = RequestMethod.PUT) - public Mono modifyCity(@RequestBody City city) { - return Mono.create(cityMonoSink -> cityMonoSink.success(cityService.updateCity(city))); - } - - @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) - public Mono modifyCity(@PathVariable("id") Long id) { - return Mono.create(cityMonoSink -> cityMonoSink.success(cityService.deleteCity(id))); - } -} diff --git a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/dao/CityRepository.java b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/dao/CityRepository.java new file mode 100644 index 0000000..9ea9e9e --- /dev/null +++ b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/dao/CityRepository.java @@ -0,0 +1,43 @@ +package org.spring.springboot.dao; + +import org.spring.springboot.domain.City; +import org.springframework.stereotype.Repository; + +import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicLong; + +@Repository +public class CityRepository { + + private ConcurrentMap repository = new ConcurrentHashMap<>(); + + private static final AtomicLong idGenerator = new AtomicLong(0); + + public Long save(City city) { + Long id = idGenerator.incrementAndGet(); + city.setId(id); + repository.put(id, city); + return id; + } + + public Collection findAll() { + return repository.values(); + } + + + public City findCityById(Long id) { + return repository.get(id); + } + + public Long updateCity(City city) { + repository.put(city.getId(), city); + return city.getId(); + } + + public Long deleteCity(Long id) { + repository.remove(id); + return id; + } +} diff --git a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/handler/CityHandler.java b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/handler/CityHandler.java new file mode 100644 index 0000000..38bb8d2 --- /dev/null +++ b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/handler/CityHandler.java @@ -0,0 +1,42 @@ +package org.spring.springboot.handler; + +import org.spring.springboot.dao.CityRepository; +import org.spring.springboot.domain.City; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Component +public class CityHandler { + + private final CityRepository cityRepository; + + @Autowired + public CityHandler(CityRepository cityRepository) { + this.cityRepository = cityRepository; + } + + public Mono save(City city) { + return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.save(city))); + } + + public Mono findCityById(Long id) { + return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.findCityById(id))); + } + + public Flux findAllCity() { + return Flux.create(cityFluxSink -> { + cityRepository.findAll().forEach(city -> cityFluxSink.next(city)); + cityFluxSink.complete(); + }); + } + + public Mono modifyCity(City city) { + return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.updateCity(city))); + } + + public Mono deleteCity(Long id) { + return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.deleteCity(id))); + } +} diff --git a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/service/CityService.java b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/service/CityService.java deleted file mode 100644 index 441ffbb..0000000 --- a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/service/CityService.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.spring.springboot.service; - -import org.spring.springboot.domain.City; - -import java.util.List; - -/** - * 城市业务逻辑接口类 - * - * Created by bysocket on 09/29/2017. - */ -public interface CityService { - - /** - * 获取城市信息列表 - * - * @return - */ - List findAllCity(); - - /** - * 根据城市 ID,查询城市信息 - * - * @param id - * @return - */ - City findCityById(Long id); - - /** - * 新增城市信息 - * - * @param city - * @return - */ - Long saveCity(City city); - - /** - * 更新城市信息 - * - * @param city - * @return - */ - Long updateCity(City city); - - /** - * 根据城市 ID,删除城市信息 - * - * @param id - * @return - */ - Long deleteCity(Long id); -} diff --git a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/service/impl/CityServiceImpl.java b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/service/impl/CityServiceImpl.java deleted file mode 100644 index 1a628a6..0000000 --- a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/service/impl/CityServiceImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.spring.springboot.service.impl; - -import org.spring.springboot.domain.City; -import org.spring.springboot.service.CityService; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 城市业务逻辑实现类 - * - * Created by bysocket on 09/29/2017. - */ -@Service -public class CityServiceImpl implements CityService { - - // 模拟数据库,存储 City 信息 - private static Map CITY_DB = new HashMap<>(); - - public List findAllCity() { - return new ArrayList<>(CITY_DB.values()); - } - - public City findCityById(Long id) { - return CITY_DB.get(id); - } - - @Override - public Long saveCity(City city) { - city.setId(CITY_DB.size() + 1L); - CITY_DB.put(city.getId(), city); - return city.getId(); - } - - @Override - public Long updateCity(City city) { - CITY_DB.put(city.getId(), city); - return city.getId(); - } - - @Override - public Long deleteCity(Long id) { - CITY_DB.remove(id); - return id; - } - -} diff --git a/springboot-webflux-2-restful/src/main/java/org/spring/springboot/webflux/controller/CityWebFluxController.java b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/webflux/controller/CityWebFluxController.java new file mode 100644 index 0000000..b3956e9 --- /dev/null +++ b/springboot-webflux-2-restful/src/main/java/org/spring/springboot/webflux/controller/CityWebFluxController.java @@ -0,0 +1,41 @@ +package org.spring.springboot.webflux.controller; + +import org.spring.springboot.domain.City; +import org.spring.springboot.handler.CityHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping(value = "/city") +public class CityWebFluxController { + + @Autowired + private CityHandler cityHandler; + + @GetMapping(value = "/{id}") + public Mono findCityById(@PathVariable("id") Long id) { + return cityHandler.findCityById(id); + } + + @GetMapping() + public Flux findAllCity() { + return cityHandler.findAllCity(); + } + + @PostMapping() + public Mono saveCity(@RequestBody City city) { + return cityHandler.save(city); + } + + @PutMapping() + public Mono modifyCity(@RequestBody City city) { + return cityHandler.modifyCity(city); + } + + @DeleteMapping(value = "/{id}") + public Mono deleteCity(@PathVariable("id") Long id) { + return cityHandler.deleteCity(id); + } +}