Пагинация java spring и параметры запроса

Рейтинг: -1Ответов: 1Опубликовано: 03.04.2023

подскажите как правильно реализовать получение списка пользователей (users) с фильтрацией по компании с пагинацией? Реализовал соответствующие методы. По отдельности они работают: http://localhost:8080/api/users?page=0&limit=10 http://localhost:8080/api/users?companyName=Техно

при попытке сделать запрос: http://localhost:8080/api/users?page=0&limit=10&companyName=Техно

падает с ошибкой

Ambiguous handler methods mapped for '/api/users': {public org.springframework.http.ResponseEntity com.example.books_shope.controllers.UserController.getUsersCompanyName(java.lang.String), public org.springframework.http.ResponseEntity com.example.books_shope.controllers.UserController.getAllPage(java.lang.Integer,java.lang.Integer)}
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:432) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:383) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:125) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:67) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1266) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1048) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.26.jar:5.3.26]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.26.jar:5.3.26]

Подскажите в чем ошибаюсь, где нужно доработать логику чтобы запрос http://localhost:8080/api/users?page=0&limit=10&companyName=Техно отработал?


@RestController
@RequestMapping("/api/users")
@CrossOrigin(origins = "http://localhost:63342")                               
public class UserController {

    @Autowired
    private UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping
    public ResponseEntity createUser (@RequestBody Users user) {
        userService.addUser(user);
        return ResponseEntity.ok("Пользователь успешно создан");
    }

    // получить список пользователей
    @GetMapping
    public ResponseEntity getAll() {
        return ResponseEntity.ok(userService.getAllUsers());
    }

    // метод с пагинацией получить список пользователей
    @GetMapping(params = "page")
    public ResponseEntity getAllPage(
            @RequestParam(value = "page", required = false) Integer page,
            @RequestParam(value = "limit", required = false) Integer limit) {

        return ResponseEntity.ok(userService.getPageUsers(page, limit).getContent());
}

  

    //фильтр по компании
    @GetMapping(params = "companyName")
    public ResponseEntity<List<Users>> getUsersCompanyName(@RequestParam("companyName") String company) {
        return ResponseEntity.ok(userService.getUsersByCompanyName(company));
    }


}

@Service
public class UserService {


    @Autowired
    private UserRepo userRepo;

    public UserService(UserRepo userRepo) {
        this.userRepo = userRepo;
    }

    // логика создания пользователя

    public Users addUser(Users user) {
        userRepo.save(user);
        return user;
    }


    // логика получения списка пользователей

    public Iterable <Users> getAll() {
        return userRepo.findAll();
    }

 

    // фильтр по компании
    public List<Users> getUsersByCompanyName(String company) {
        return userRepo.findUsersByCompanyNameContaining(company);
    }


    // логика получения списка пользователей с пагинацией
    public Page<Users> getPageUsers(Integer page, Integer limit) {
        Pageable nextPage = PageRequest.of(page, limit);
        return userRepo.findAll(nextPage);
    }

    public List<Users> getAllUsers() {
        return userRepo.findAll();
    }

}
public interface UserRepo extends JpaRepository<Users, Long> {

    // фильтрация по статусу

    Users findByStatus(String status);
    List<Users> findUsersByStatus(UserStatus status);

    // фильтрация по компании

    Users findByCompanyName(String company);
    List<Users> findUsersByCompanyNameContaining(String userCompanyName);
}
@Data
@Entity
@Table(name="users")
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name="surname")
    private String surname;

    @Column(name="company_name")
    private String companyName;

    @Column(name = "email")
    private String email;

    @Column(name="post")
    @Enumerated(EnumType.STRING)
    private UserPost post;

    public UserPost getPost() {
        return post;
    }

    public void setPost(UserPost post) {
        this.post = post;
    }

    @Column(name="department")
    private String department;

    @Column(name="status")
    @Enumerated(EnumType.STRING)
    private UserStatus status;

    public UserStatus getStatus() {
        return status;
    }

    public void setStatus(UserStatus status) {
        this.status = status;
    }
}

Ответы

▲ 0Принят

В репозитории понадобится определить метод(ы) для работы со страницами:

public interface UserRepo extends JpaRepository<Users, Long> {
// ...
  Page<Users> findByCompanyNameContaining(String companyName, Pageable paging);
}

Реализовать в сервисе метод для поиска пользователей с фильтром и пагинацией:

@Service
public class UserService {

    @Autowired
    private UserRepo userRepo;

    public List<Users> usersByCompanyName(String companyName, Pageable paging) {
        Page<Users> page = companyName == null 
            ? userRepo.findAll(paging)
            : userRepo.findByCompanyNameContaining(companyName, paging);

        return page.getContent();
    }
}

И вызвать этод метод в контроллере:

@RestController
@RequestMapping("/api/users")
@CrossOrigin(origins = "http://localhost:63342")                               
public class UserController {
    // ...
    @GetMapping()
    public ResponseEntity<List<Users>> getUsers(
        @RequestParam(required = false) String companyName,
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "5") int limit
    ) {
        return ResponseEntity.ok(userService.usersByCompanyName(
            companyName, PageRequest.of(page, limit)
        ));
    }
}