我正在使用Spring Boot Rest Controller。
我使用此Enum:
public enum Lang {
EN,FR
}
我的存储库:
public List<Items> findByNameContainsAndLang(String name,Lang language);
我的控制器:
@RequestMapping(value = "/items", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<ItemModel>> getSearchedItems(
@RequestParam(name = "name", defaultValue = "",required = false) String name,
@RequestParam(name = "language",required = false) Lang language
) {
return ResponseEntity.ok(itemServiceImp.findSearchedItem(name, language));
}
这是我的服务:
public List<ItemModel> findSearchedItem(String name, Lang language ){
List<ItemModel> lst=null;
lst = itemRepo.findByNameContainsAndLang(name language)
.stream()
.map(this::mapItemModel)
.collect(toList());
return lst;
}
所以当我尝试这个路径时:
http://myUrl/items?name=something&language=EN
那将检索结果并返回我的数据 但是当我尝试:
http://myUrl/items?name=something
http://myUrl/items?language=EN
http://myUrl/items
检索0个数据和一个空列表
有人有想法吗,尽管我在@Requestparam
中使用了 require = false 有帮助吗?预先谢谢
答案 0 :(得分:0)
required = false
表示端点不希望该参数存在。这对您的查询没有影响。因此,当前,当您省略其中一个值时,该值将为null。结果找不到匹配项。
要解决此问题,您可以查看JPA Criteria API,它将帮助您构建仅考虑填充值的查询。
答案 1 :(得分:0)
@Reg是正确的。
您可以使用自定义存储库,也可以尝试根据name
和language
变量的值调用不同的存储库方法。
public List<ItemModel> findSearchedItem(String name, Lang language ) {
List<ItemModel> list = null;
if(name != null && language != null) {
list = findByNameContainsAndLang(String name,Lang language);
} else if(name == null) {
list = findByLang(Lang language); //Add this method in your repo
} else if(language == null){
list = findByName(String name); //Add this method in your repo
}
return list;
}