Я написал это сопоставление запроса для доступа к тикету по его идентификатору с необязательными параметрами запроса ticketType & ticketStatus:
@GetMapping(path = "/tickets/{ticketId}")
@ResponseStatus(value = HttpStatus.OK)
public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId, @RequestParam("ticketType") final String ticketType, @RequestParam("ticketStatus") final String ticketStatus)
В настоящее время хранилище содержит методы для возврата, основанные либо на ticketId, либо на ticketState. :
@Repository
public interface TicketRepository extends JpaRepository<TicketEntity, Long> {
Stream<TicketEntity> findByTicketIdAndTicketState(@Param("ticketId") Long ticketId);
Stream<TicketEntity> findByTicketIdAndTicketState(@Param("ticketId") Long ticketId, @Param("ticketState") String ticketState);
}
Как эти конечные точки должны отображаться на уровне контроллера?
В настоящее время конечная точка:
@GetMapping(path = "/{ticketId}")
@ResponseStatus(value = HttpStatus.OK)
public ResponseEntity<List<TicketResponse>> getTicketsByTicketId(
@PathVariable("productId") final Long ticketId, @RequestParam(name = "ticketState", required=false) final String ticketState) {
final List<TicketResponse> ticketsByTicketId = ticketService.getTicketsByTicketId(ticketId);
if(ticketsByTicketId.size() == 0){
return ResponseEntity.ok("No tickets found");
}
else {
return ResponseEntity.ok(ticketsByTicketId);
}
}
Должна ли я добавить новую конечную точку? :
Или обновить контроллер, чтобы выбрать, какой метод репозитория JPA реализовать в зависимости от запроса?:
@GetMapping(path = "/{ticketId}")
@ResponseStatus(value = HttpStatus.OK)
public ResponseEntity<List<TicketResponse>> getTicketsByTicketId(
@PathVariable("productId") final Long ticketId, @RequestParam(name = "ticketState", required=false) final String ticketState) {
List<TicketResponse> tickets = null;
if(ticketState == null) {
tickets = ticketService.getTicketsByTicketId(ticketId);
}
else{
tickets = ticketService.getTicketsByTicketIdAndTicketState(ticketId, ticketState);
}
if(ticketsByTicketId.size() == 0){
return ResponseEntity.ok("No tickets found");
}
else {
return ResponseEntity.ok(ticketsByTicketId);
}
}
Репозиторий JPA будет расширен для фильтрации на основе многих других параметров, таких как ticketType, ticketDescription. Я просто упоминаю об этом, так как логика моего контроллера c станет очень сложной, если потребуется проверить, какой параметр имеет значение null, и выбрать соответствующий запрос JPA.