пружинить несколько конечных точек с одинаковыми параметрами запроса - PullRequest
1 голос
/ 18 апреля 2020

У меня есть RestController.

@RestController
@RequestMapping("/api/children")
public class ChildController {

    private ChildService childService;

    @Autowired
    public ChildController(ChildService childService) {
        this.childService = childService;
    }

    @GetMapping
    public List<ChildDto> list() {
        List<ChildDto> response = childService.list();
        return response;
    }


    @GetMapping(params = "parentId")
    public List<ChildDto> getChildrenByParent(@RequestParam Integer parentId) {
        List<ChildDto> response = childService.getChildrenByParent(parentId);
        return response;
    }

    @GetMapping(params = {"fullName", "age", "parentId"})
    public List<ChildDto> getFilteredChildren(@RequestParam String fullName,
                                              @RequestParam Integer age,
                                              @RequestParam Integer parentId) {
        List<ChildDto> response = childService.getFilteredChildren(fullName, age, parentId);
        return response;
    }
}

В моей служебной логике c в обслуживании все должно быть в порядке, если какой-либо параметр в getFilteredChildren не отправляется, но у меня возникает проблема, когда я отправляю запрос на

http://localhost:8080/api/children?age=10&parentId=3

обрабатывается getChildrenByParent, а не getFilteredChildren

Что я могу сделать, кроме отправки всех параметров типа

http://localhost:8080/api/children?age=10&parentId=3&fullName=

или изменение пути для некоторых конечных точек

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Вы не достигли getFilteredChildren(), потому что по умолчанию все параметры запроса являются обязательными. Так как некоторые отсутствуют, эта конечная точка отбрасывается. Итак, одна вещь, которую вы можете попробовать, это сделать некоторые параметры необязательными:

@GetMapping(params = {"fullName", "age", "parentId"})
public List<ChildDto> getFilteredChildren(@RequestParam(required = false) String fullName,
                                          @RequestParam Integer age,
                                          @RequestParam Integer parentId) {
    List<ChildDto> response = childService.getFilteredChildren(fullName, age, parentId);
    return response;
}
1 голос
/ 18 апреля 2020

Вам необходимо использовать правильное отображение. Если у вас есть параметры строки запроса, используйте одно сопоставление и, исходя из его значения, вызовите соответствующий метод обслуживания

@GetMapping
    public List<ChildDto> getChildren(@RequestParam(name = "fullName", required = false) String fullName,
            @RequestParam(name = "age", required = false) Integer age,
            @RequestParam(name = "parentId", required = false) Integer parentId) {
        List<ChildDto> response = null;
        if (null == fullName && null == age && null == parentId) {
            response = childService.list();
        } else if (null == fullName && null == age) {
            response = childService.getChildrenByParent(parentId);
        } else {
            response = childService.getFilteredChildren(fullName, age, parentId);
        }
        return response;
    }
...