@RequestParam по-прежнему дает ноль, даже если это не требуется - PullRequest
0 голосов
/ 05 июля 2018

У меня есть контроллер с одним параметром:

@GetMapping("/people")
    public Page<People> list(
            @RequestParam(name="name", required = false) String name
            Pageable pageable
            ){

        Page<People> peoples=PeopleService.findByName(pageable,name);
        return peoples;

    }

Когда я перехожу к localhost:8080/people?name=John, это дает мне правильные данные, но когда я перехожу к localhost:8080/people, это не дает мне никаких данных, но я хочу, чтобы они давали мне всех людей.

Я обнаружил, что это вызвано Spring, он все еще ищет where name=null.

Как решить эту проблему, потому что у меня есть больше параметров, таких как возраст, дата и т. Д.

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

Вы можете использовать Specifications в Spring Data.

Просто сделайте ваш PeopleService интерфейс (если это ваш интерфейс хранилища данных Spring) расширяющим JpaSpecificationExecutor< People > и создайте класс наподобие PeopleSpecification, который реализует Specification< People > следующим образом:

public class PeopleSpecification implements Specification<People> {

    private String firstName;

    //getters and setters

    public Predicate toPredicate(Root<People> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        if (firstName != null)
            return cb.equal(root.get("firstName"), firstName);
        return cb.and();
    }
}

Затем измените метод контроллера, чтобы получить экземпляр PeopleSpecification в качестве параметра:

public Page<People> list(@ModelAttribute PeopleSpecification specification, Pagable pageable)

И, наконец, используйте новый унаследованный метод от JpaSpecificationExecutor в вашем PeopleService в вашем контроллере:

Page<People> findAll(Specification<People> specification, Pageable pageable);

Понятно, что вы можете изменить реализацию класса PeopleSpefication, чтобы иметь столько атрибутов, сколько хотите, и изменить логику метода toPredicate, чтобы он возвращал правильный объект Predicate.

0 голосов
/ 05 июля 2018

Вы вызываете метод findByName с параметром name, который не требуется. Проверьте, является ли переменная имени пустой или нет, и в зависимости от этого вызова findByName или findAll метод.

@GetMapping("/people")
    public Page<People> list(
            @RequestParam(name="name", required = false) String name
            Pageable pageable
            ){
        if(name != null){

        Page<People> peoples=PeopleService.findByName(pageable,name);
        return peoples;

        }else{

        Page<People> peoples=PeopleService.findAll(pageable);
        return peoples;

        }

    }
...