Я работал над образцом реактивного веб-API с использованием Spring Boot 2.0.1 и его библиотеки Webflux. Я искал примеры из интернета, чтобы попытаться создать его, но я нахожусь в тупике на две вещи. Ниже приведены два вопроса, которые у меня есть.
1) Как вернуть поток объектов ответа, когда я пытаюсь получить сообщение о том, что может быть возвращен только один объект ответа. Ниже мой текущий код.
@Service
public class MovieServiceImpl implements MovieService {
@Autowired
private MovieRepository movieRepository;
@Override
public Flux<Movie> list(){
return movieRepository.findAll();
}
}
@RestController
public class MovieRestController {
@Autowired
private MovieService movieService;
@GetMapping(value = "/movies")
public Flux<Movie> list() {
return movieService.list();
}
}
2) Когда я обновляю объект, я использую flatMap для обновления объекта, сохраненного в Mongo, а затем карту, чтобы превратить его в объект ответа. У меня вопрос, почему я использую здесь FlatMap вместо карты? Я получил этот код из онлайн-примеров, но ни один пример не объяснил использование flatMap. Я хотел бы понять, почему это используется здесь. Ниже приведен код.
@Service
public class MovieServiceImpl implements MovieService {
@Autowired
private MovieRepository movieRepository;
@Override
public Mono<Movie> update(String id, MovieRequest movieRequest) {
return movieRepository.findById(id).flatMap(existingMovie -> {
if(movieRequest.getDescription() != null){
existingMovie.setDescription(movieRequest.getDescription());
}
if(movieRequest.getRating() != null){
existingMovie.setRating(movieRequest.getRating());
}
if(movieRequest.getTitle() != null) {
existingMovie.setTitle(movieRequest.getTitle());
}
return movieRepository.save(existingMovie);
});
}
}
@RestController
public class MovieRestController {
@Autowired
private MovieService movieService;
@PutMapping("/movies/{movieId}")
public Mono<ResponseEntity<Movie>> update(
@PathVariable("movieId") final String movieId,
@RequestBody final MovieRequest movieRequest) {
return movieService.update(movieId, movieRequest)
.map(m -> new ResponseEntity<>(m, HttpStatus.OK))
.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
}