This is my first time using spring-webflux with SpringBoot. My goal is to create an API that accepts a list of Users in JSON format in the body of a POST and return a response with that list also in JSON format ordered by a date field. The ordering is not a problem but I do not know very well how to make this architecture. So far I have:
UserWebfluxApplication (with the @SpringBootApplication)
model/User.java (id, name, surname, creationDate)
service/UserService.java (Interface)
service/UserServiceImpl.java implementing the Interface with the WebClient and with the following method:
@Override public List<User> processUserDataFromUserList() { Mono<List<User>> response = webClient.get() .accept(MediaType.APPLICATION_JSON) .retrieve() .bodyToMono(new ParameterizedTypeReference<List<User>>() {}); List<User> users = response.block(); return users .stream() .sorted(Comparator.comparing(User::getCreatedTime)) .collect(Collectors.toList()); }
controller/UserController.java (Here I don’t know how can I construct this class for reach my achievement testing the request for example with curl, Postman, or whatever). So far I’ve this in the UserController:
@RestController public class UserController { @Autowired private UserService userService; @PostMapping(value = {"/readUser"}) @ResponseStatus(HttpStatus.OK) public void readUser(@RequestBody List<User> users) { userService.processUserDataFromUserList(); } }
The json request will be like:
{ "id": 951, "name": "Marco", "surname": "Polo", "creationDate": "2021-01-23T02:36:09-08:00" }, { "id": 952, "name": "Estela", "surname": "Star", "creationDate": "2021-01-14T18:30:09-07:00" }, { "id": 953, "name": "Jim", "surname": "Pask", "creationDate": "2021-01-02T08:22:12+05:00" }, { "id": 954, "name": "Lorena", "surname": "Cubo", "creationDate": "2021-02-15T01:01:32-02:00" }
Thank you in advance.
Advertisement
Answer
Finally I’ve solved it by the following:
Controller:
@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @PostMapping(value = {"/getByCreatedTimeAsc"}) @ResponseStatus(HttpStatus.OK) public Flux<User> readUsers(@RequestBody List<User> users) { return userService.processUserDataFromUserList(users); } }
Service:
@Service public class UserServiceImpl implements UserService { @Override public Flux<User> processUserDataFromUserList(List<User> users) { return Flux.fromIterable(users.stream() .sorted(Comparator.comparing(User::getCreatedTime)) .collect(Collectors.toList())); } }
The main problem I was facing is that I was trying to manage the list with Mono rather than Flux.