Я разрабатываю API для курсов колледжа и хочу, чтобы запросы могли обрабатывать несколько параметров запроса, которые по-разному уточняют поиск. Пример с двумя параметрами:
http://url.com/api/courses/search?subje ... umber=1302
Я пытаюсь найти способ обработки всех различных параметров заголовка поиска в одном методе класса обслуживания. Я хочу, чтобы параметры могли быть в любом порядке и с любым количеством параметров (запрос может иметь 0 или столько, сколько поддерживает API). На данный момент код настроен на поддержку только одного параметра за раз. Заголовок темы принимает любые параметры, а список распаковывается в CourseService.java. Я предполагаю, что есть более простой способ сделать это, чем писать новый случай if для каждой комбинации параметров?
Возможно, что-то вроде этого псевдокода, каждый из которых дополнительно уточняет прошлый результат:
search(fullDatabase, param1);
search(search1, param2);
search(search2, param3);
Вот мой текущий код:
CourseController.java
@RestController
@RequestMapping("/api/courses")
public class CourseController {
@Autowired
private CourseService courseService;
@RequestMapping("/search")
public List searchCourses(@RequestParam Map params) {
return courseService.getCourses(params);
}
}
CourseService.java
@Service
public class CourseService {
@Autowired
private CourseRepository courseRepository;
/** Handles all logic for query parameters. */
public List getCourses(Map params) {
if (params.keySet().contains("crn")) {
return courseRepository.findByCrn(params.get("crn"));
} else if (params.keySet().contains("subject")) {
return courseRepository.findBySubject(params.get("subject"));
} else if (params.keySet().contains("number")) {
return courseRepository.findByNumber(params.get("number"));
} else if (params.keySet().contains("seats")) {
return courseRepository.findBySeats(params.get("seats"));
}
throw new QueryArgumentException(null, getClass(), params);
}
}
CourseRepository.java
@Repository
public interface CourseRepository extends JpaRepository {
@Query("FROM Course WHERE crn = ?1")
List findByCrn(String crn);
@Query("FROM Course WHERE subject = ?1")
List findBySubject(String subject);
@Query("FROM Course WHERE number = ?1")
List findByNumber(String number);
@Query("FROM Course WHERE department = ?1")
List findByDepartment(String department);
@Query("FROM Course WHERE seats >= ?1")
List findBySeats(String seats);
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... g-boot-jpa