Spring, фильтрующий данные с использованием enum, не принимает обязательный = false в @RequestParam - PullRequest
0 голосов
/ 12 декабря 2018

Я использую контроллер начальной загрузки пружины.

Я использую этот 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 данных и пустой список

У кого-нибудь есть идея, хотя я использую require = false в @Requestparam Любая помощь?Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

@ 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;
}
0 голосов
/ 12 декабря 2018

required = false означает, что конечная точка не ожидает присутствия параметра.Это не влияет на ваш запрос.Поэтому в настоящее время, когда вы опускаете одно из значений, это значение будет нулевым.В результате не найдено совпадений.

Чтобы решить эту проблему, вы можете обратиться к API критериев JPA, который поможет вам в построении запросов, которые учитывают только заполненные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...