Spring Boot Rest Web Service извлекает несколько параметров в запросе на получение - PullRequest
0 голосов
/ 29 февраля 2020

Я создаю веб-службу Spring Boot и у меня есть модель Employee

public class Employee {
  private String id;
  private String name;
  private String designation;
  private int salary;
 //Has Getters and Setters
}

Я хочу создать запрос Get, который будет извлекать и фильтровать Список сотрудников на основе параметров, заданных пользователем.

Например, если пользователь указывает имя сотрудника и его имя, метод get должен фильтровать эти результаты. Для различных комбинаций параметров это должно работать.

@Override
    public List<Employee> getEmployees(Map<String, Object> parameters) {
        if (parameters.size() == 0)
//          code to return all employees;
        List<Employee> selectedEmployees = new ArrayList<Employee>();
        for(Employee currentEmployee: new ArrayList<Employee>(employee.values())) {
            for(Map.Entry<String, Object> check: parameters.entrySet()) {
                try {
                    if(check.getValue() instanceof Integer) {
                        int condition = (int) Employee.class.getMethod("get" + check.getKey()).invoke(currentEmployee);
                        if((int) check.getValue() == condition)
                            selectedEmployees.add(currentEmployee);
                    } else if (check.getValue() instanceof String) {
                        String condition = (String) Employee.class.getMethod("get" + check.getKey()).invoke(currentEmployee);
                        if (((String) check.getValue()).equals(condition))
                            selectedEmployees.add(currentEmployee);
                    }
                } catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
        return selectedEmployees; 
    }

Во избежание множественных, если еще случаев, я фильтрую список на основе строк и целых чисел выше.

Я думаю, что я делаю ошибку в приведенном ниже коде, который отправляет запрос в контроллер.

@RequestMapping(value={"/employees","/{id}/{name}/{designation}/{salary}"})
    public List<Employee> getEmployeeByProperty(EmployeeRequestParameters requestParams){
        //Map for storing parameters to filter the List
        Map<String, Object> filterParams = new HashMap<>();
        if(requestParams.getIdParam().isEmpty()) {
            filterParams.put("id", Integer.parseInt(requestParams.getIdParam()));   
        } 
        if(!requestParams.getNameParam().isEmpty()) {
            filterParams.put("name", requestParams.getNameParam()); 
        } 
        if(!requestParams.getDesignationParam().isEmpty()) {
            filterParams.put("designation", requestParams.getDesignationParam());   
        } 
        if(requestParams.getSalaryParam().isEmpty()) {
            filterParams.put("salary", Integer.parseInt(requestParams.getSalaryParam()));   
        }       
        return EmployeeService.getEmployeesByProperty(filterParams);
    }

1 Ответ

0 голосов
/ 29 февраля 2020

Если поле {id} не заполнено, {name} или {обозначение} или {salary} должны быть нулевыми. Для {name} или {обозначение} или {salary} должно быть заполнено, поскольку должно быть {id} заполнено.

@GetMapping("/employees")
public List<Employee> getEmployeeByProperty(@RequestParam(value = "id", required=false) String id,
                                            @RequestParam(value = "name", required=false) String name,
                                            @RequestParam(value = "designation", required=false) String designation,
                                            @RequestParam(value = "salary", required=false) int salary) {
                                                //Your codes
                                            }

Даже если {id} пуст, вы можете использовать другие.

...