-1

I have a RestController with a few endpoints and some of them receive a lot of request params. Could you give me a few tips how to improve it? It doesn't look good.

@GetMapping("/rest/players")
public ResponseEntity<List<Player>> getPlayersAccordingToParams(@RequestParam(required = false) String name,
                                                                @RequestParam(required = false) String title,
                                                                @RequestParam(required = false) Race race,
                                                                @RequestParam(required = false) Profession profession,
                                                                @RequestParam(required = false) Long after,
                                                                @RequestParam(required = false) Long before,
                                                                @RequestParam(required = false) Boolean banned,
                                                                @RequestParam(required = false) Integer minExperience,
                                                                @RequestParam(required = false) Integer maxExperience,
                                                                @RequestParam(required = false) Integer minLevel,
                                                                @RequestParam(required = false) Integer maxLevel,
                                                                @RequestParam(required = false) Integer pageSize,
                                                                @RequestParam(required = false) Integer pageNumber,
                                                                @RequestParam(required = false) PlayerOrder order) {
    Pageable pageable = PageableCreator.createPageableFromParams(pageSize, pageNumber, order);
    List<Player> players = playerService.findPlayersByRequestedParam(name, title, race,
                                                                     profession,  after,
                                                                     before, banned, minExperience, maxExperience,
                                                                     minLevel, maxLevel, pageable);
    return new ResponseEntity<>(players, HttpStatus.OK);
}
@GetMapping("/rest/players/count")
public ResponseEntity<Integer> getPlayersCount(@RequestParam(required = false) String name,
                                               @RequestParam(required = false) String title,
                                               @RequestParam(required = false) Race race,
                                               @RequestParam(required = false) Profession profession,
                                               @RequestParam(required = false) Long after,
                                               @RequestParam(required = false) Long before,
                                               @RequestParam(required = false) Boolean banned,
                                               @RequestParam(required = false) Integer minExperience,
                                               @RequestParam(required = false) Integer maxExperience,
                                               @RequestParam(required = false) Integer minLevel,
                                               @RequestParam(required = false) Integer maxLevel) {
    int count = playerService.countPlayersByRequestedParam(name, title, race,
                                                           profession,  after,
                                                           before, banned, minExperience, maxExperience,
                                                           minLevel, maxLevel);
    return new ResponseEntity<>(count, HttpStatus.OK);
  • since you have this many parameters I think that DTO would be a decent approach. – zawarudo Aug 27 '22 at 19:36
  • yeah, but the endpoints must receive these params as @RequestParam according to the task. – 6ig6or6 Aug 27 '22 at 19:40
  • Did this answer your question [Map as RequestParam](https://stackoverflow.com/questions/47418489/spring-mvc-populate-requestparam-mapstring-string) – Sakil Aug 27 '22 at 19:55

2 Answers2

0

The best apporoach is to use the POJO class to map the request params to their respective attribute in the POJO and use the same in your code.

Vinoth M
  • 1
  • 2
0

You can use Map object as @RequestParam to accept all requestParams

For example:

@GetMapping(value = "/rest/players")   
public ResponseEntity<List<Player>> getPlayersAccordingToParams(@RequestParam Map<String,String> requestParams){

   String name=requestParams.get("name");
   String title=requestParams.get("title");
   .
   .
   .
   .   

  
}
Jimmy
  • 995
  • 9
  • 18
  • 1
    This is a poor approach, as you lose type conversion between parameters and your values, and now need to maintain a mapping between your values and the names of the parameters. Use a POJO. – tgdavies Aug 27 '22 at 23:01