Spring Boot Data JPA Paging реализован правильно - PullRequest
0 голосов
/ 01 января 2019

Я хочу добавить функциональность подкачки в приложении Spring Boot + Spring Data JPA, у меня есть Repository:

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
    List<Post> findAllByOrderByPostIdDesc(Pageable pageable);
}

и в классе Service у меня есть:

@Service
public class PostService {

    @Autowired
    private PostRepository postRepository;

    public List<Post> findAll(Pageable pageable) {
        return postRepository.findAllByOrderByPostIdDesc(pageable);
    }
}

в конце Controller это

@Controller
public class HomeController {

    @Autowired
    private PostService postService;

    @GetMapping(value = "/")
    public String getHomePage(Model model, Pageable pageable){
        model.addAttribute("postList", postService.findAll(pageable));
        return "home";
    }
}

код выше для http://localhost:8080 отображения Я получаю все записи в качестве ответа, но если я передам page и size params как http://localhost:8080/?page=0&size=1 Iполучить подкачку.

Теперь я хочу сделать http://localhost:8080/?page=0&size=1 по умолчанию адресом целевой страницы, и в HTML-коде, как я могу динамически обновлять значения параметров page и size, что:

 <ul class="pagination justify-content-center mb-4">
            <li class="page-item">
              <a class="page-link" th:href="@{/(page=0,size=1)}">&larr; Older</a>
            </li>
            <li class="page-item disabled">
              <a class="page-link" th:href="@{/(page=0,size=1)}">Newer &rarr;</a>
            </li>
          </ul>

Я перепробовал много хитростей, но ни один из них не помог мне !!

Обновление

Я попробовал и добавил этот класс, как это было предложено, но @Nyle Hassan,

@Configuration
public class DefaultView extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers( ViewControllerRegistry registry ) {
        registry.addViewController( "/" ).setViewName( "forward:/?page=0&size=10" );
        registry.setOrder( Ordered.HIGHEST_PRECEDENCE );
        super.addViewControllers( registry );
    }
}

это привело к:

2019-01-01 17:26:43.484 ERROR 3824 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] threw exception

java.lang.StackOverflowError: null
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:597) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:597) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:597) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:597) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) ~[tomcat-embed-core-8.5.29.jar:8.5.29]
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:597) ~[tomcat-embed-core-8.5.29.jar:8.5.29]

1 Ответ

0 голосов
/ 02 января 2019

код выше для http://localhost:8080 отображения Я получаю все записи в ответ

Вы уверены в этом?Какую версию Spring Boot вы используете?Я проверил последнюю версию (2.1.1), и вызов http://localhost:8080 без каких-либо параметров запроса приведет к созданию объекта Pageable с page = 0, size = 20, без сортировки.Просто попытайтесь установить точку отладки на org.springframework.data.web.PageableHandlerMethodArgumentResolver#resolveArgument, чтобы узнать, как Spring выполняет эту привязку.

Этот преобразователь аргументов также поставляется с аннотацией, которая позволяет изменять значения по умолчанию, которые используются, когда параметры запросанетВы можете использовать его следующим образом:

@GetMapping(value = "/")
public String getHomePage(Model model, @PageableDefault(page=0, size = 1) Pageable pageable) {
    ...
}

Страница 0 является аннотацией по умолчанию, поэтому это имеет тот же эффект:

@GetMapping(value = "/")
public String getHomePage(Model model, @PageableDefault(size = 1) Pageable pageable) {
    ...
}

в HTML-коде, как я могу динамически обновлять значениястраницы параметров и размера

В следующий раз, пожалуйста, опубликуйте два отдельных вопроса, но здесь они звучат так:

Сначала измените List<Post> на Page<Post> в вашем хранилище и службе.В вашем контроллере свяжите результат с моделью:

Page<Post> page = postService.findAll(pageable);
model.addAttribute("page", page); // page.getContent() contains the List<Page> now

И в представлении используйте page для рендеринга ссылок подкачки, например, так:

<li class="page-item">
    <a class="page-link" th:if="${page.hasPrevious()}" th:href="@{/(page=${page.previousPageable().getPageNumber()},size=${page.getSize()})}">&larr; Older</a>
</li>
<li class="page-item disabled">
    <a class="page-link" th:if="${page.hasNext()}" th:href="@{/(page=${page.nextPageable().getPageNumber()},size=${page.getSize()})}">Newer &rarr;</a>
</li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...