java - Spring Boot Data JPA Paging 以正确的方式实现

标签 java spring spring-boot pagination spring-data-jpa

我想在 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映射上的代码我得到所有记录作为响应,但是如果我传递pagesize params as http://localhost:8080/?page=0&size=1 我可以进行分页工作。

现在我想将 http://localhost:8080/?page=0&size=1 设置为默认登陆页面地址,并且在 HTML 代码中如何动态更新参数 的值页面大小是:

 <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]

最佳答案

the code above on http://localhost:8080 mapping I get all the records as response

你确定吗?您使用的是哪个版本的 Spring Boot?我检查了最新版本(2.1.1)并调用 http://localhost:8080没有任何查询参数将实例化一个 Pageable 对象,其中 page = 0,size = 20,不排序。只需尝试将调试点设置为 org.springframework.data.web.PageableHandlerMethodArgumentResolver#resolveArgument了解 Spring 如何执行此绑定(bind)。

此参数解析器还附带一个注释,允许您更改在查询参数不存在时使用的默认值。您可以像这样使用它:

@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) {
    ...
}

in HTML code how can I dynamically update values of params page and size

下次,请发布两个单独的问题,但这里是:

首先,更改List<Post>Page<Post>在您的存储库和服务中。在您的 Controller 中,将结果绑定(bind)到模型:

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

并在 View 中使用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>

关于java - Spring Boot Data JPA Paging 以正确的方式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53995348/

相关文章:

java - 在java中使用日志的正确方法?

java - Spring JmsTemplate + 安全

java - Spring Data Rest 添加包中的所有投影

java - Spring 是否有针对 mongoDB 的 @MappedSuperclass 等效注释?

java - 使用 Spring Boot 和 Hibernate 保护单个实体免遭级联删除

java - 如何动态添加新的自定义按钮?

java - 在 Chrome 浏览器中使用 selenium webdriver 截取屏幕截图

java - 从原始文件夹播放随机声音

java - 如何使用 Spring RestTemplate 将 List 或 String 数组传递给 getForObject

java - Spring Boot获取Api响应: Ebay API