Spring使用枚举过滤数据在@RequestParam中不接受required = false

时间:2018-12-12 10:42:29

标签: spring rest enums spring-data-jpa

我正在使用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 有帮助吗?预先谢谢

2 个答案:

答案 0 :(得分:0)

required = false表示端点不希望该参数存在。这对您的查询没有影响。因此,当前,当您省略其中一个值时,该值将为null。结果找不到匹配项。

要解决此问题,您可以查看JPA Criteria API,它将帮助您构建仅考虑填充值的查询。

答案 1 :(得分:0)

@Reg是正确的。

您可以使用自定义存储库,也可以尝试根据namelanguage变量的值调用不同的存储库方法。

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;
}