是时候简要考虑如何编写简洁的代码了! 我的虚拟图书馆中有一个REST端点,可以列出我们在那里拥有的所有图书:
@GetMapping(path = "/books")
public List<Book> getBooks() {
return bookService.findAllBooks();
}
他们说:“嘿,javanewbie!有时候我们想在从UI请求时按图书作者过滤该列表” 我说:“好”,现在是:
@GetMapping(path = "/books")
public List<Book> getBooks(
@RequestParam(value = "author", required = false) String author) {
if (isEmpty(author)) {
return bookService.findAllBooks();
} else {
return bookService.findBooksByAuthor(bookName);
}
}
现在他们说:“嘿,我们现在希望有时也可以按年份过滤所有书籍” 所以我想...嗯,它会变得像这样:
@GetMapping(path = "/books")
public List<Book> getBooks(
@RequestParam(value = "author", required = false) String author,
@RequestParam(value = "year", required = false) String year) {
if (isNotEmpty(author)) {
return bookService.findBooksByAuthor(author);
} else if (isNotEmpty(year)) {
return bookService.findBooksByYear(year);
} else {
return bookService.findAllBooks();
}
}
如果以后他们要求更多可选参数-我应该将此API拆分为单独的端点还是发明一些复杂而智能的搜索? 你怎么会去这里
答案 0 :(得分:0)
对于那些感兴趣的人-我决定不像Java会议的解决方案那样让它太酷。 因此解决方案是:
使用org.springframework.data.domain.Example例如
Example<Book> bookExample = Example.of(probe, ExampleMatcher.matchingAll())
使用org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example<S>)
,例如bookRepository.findAll(bookExample)
仅查找那些与传入参数匹配的实体
BINGO。