Одна и та же конечная точка с разными вариантами путей

#spring-boot #rest #spring-data

Вопрос:

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

 @GetMapping(value= { "/users",
                     "/users/{grade}/{profession}",
                     "/users/{region}/{profession}",
                     "/users/{region}/{grade}",  
})
public List<AppUser> filtreListUsers(
            @PathVariable Optional<String> region,
            @PathVariable Optional<String> profession,
            @PathVariable Optional<String> grade
        
){ 
        if(profession.isPresent() amp;amp; grade.isPresent()) {
             return accountService.filtreListUsers(profession.get(), grade.get());
        }
        if(region.isPresent()  amp;amp; profession.isPresent() ) {
             return accountService.filtreUsersByRegionProfession(region.get(), profession.get());
        }
        if(region.isPresent()  amp;amp; grade.isPresent()) {
             return accountService.filtreUsersByRegionGrade(region.get(), grade.get());
        }   
        return accountService.listUsers();
}
 

Результат, на котором я присутствую, должен быть таким :
http://localhost:8084/users/region/grade : должен дать мне список пользователей по обоим вариантам

http://localhost:8084/users/region/profession : должен дать мне список пользователей по обоим вариантам

Спасибо за заранее.

Ответ №1:

Ваши конечные точки противоречат друг другу. Я предлагаю вам использовать параметры запроса для фильтрации, а не переменные пути.

 @GetMapping("/users")
public List<AppUser> filtreListUsers(
            @RequestParam Optional<String> region,
            @RequestParam Optional<String> profession,
            @RequestParam Optional<String> grade
        
){ 
        if(profession.isPresent() amp;amp; grade.isPresent()) {
             return accountService.filtreListUsers(profession.get(), grade.get());
        }
        if(region.isPresent()  amp;amp; profession.isPresent() ) {
             return accountService.filtreUsersByRegionProfession(region.get(), profession.get());
        }
        if(region.isPresent()  amp;amp; grade.isPresent()) {
             return accountService.filtreUsersByRegionGrade(region.get(), grade.get());
        }   
        return accountService.listUsers();
}
 

Некоторые из ваших возможных URL-адресов

 /users?grade=xyzamp;region=abcamp;profession=123
/users?grade=xyzamp;region=abc
/users?grade=xyzamp;profession=123
/users?region=abcamp;profession=123
 

Комментарии:

1. Спасибо за помощь, он отлично работает с парами. @ZohaibAhmed

2. Не могли бы вы принять ответ, если бы он сработал для вас? Спасибо