我想在 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 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)}">← Older</a>
</li>
<li class="page-item disabled">
<a class="page-link" th:href="@{/(page=0,size=1)}">Newer →</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()})}">← 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 →</a>
</li>
关于java - Spring Boot Data JPA Paging 以正确的方式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53995348/