spring data jpa对于基础的web支持,在使用
@EnableSpringDataWebSupport
后就会获得
DomainClassConverter
: 可以让springMVC通过请求参数或者路径变量来解析被repository
管理的实体类对象HandlerMethodArgumentResolver
: 可以让springMVC可以从接收的请求参数中解析Pageable
和sort
实例
DomainClassConverter
- 实体类转化器可以让你在mvc的方法中使用该对象,无需手动从
repository
查询实例
@Controller
@RequestMapping("/users")
class UserController {
@RequestMapping("/{id}")
String showUserForm(@PathVariable("id") User user, Model model) {
model.addAttribute("user", user);
return "userForm";
}
}
- 就像上面代码所展现的,方法直接获得了一个instance实例,没有去查询.底层是让mvc调用
findById
的方法实现的,目前的jpa版本必须要让repository
实现CrudRepository
才可以这样做.
分页和排序功能所依赖的HandlerMethodArgumentResovlers
- 默认注册的
PageableHandlerMethodArgumentResolver
和SortHandlerMethodArgumentResolver
使得Pageable
和sort
成为可以在控制器中方法中的有效的参数
@Controller
@RequestMapping("/users")
class UserController {
private final UserRepository repository;
UserController(UserRepository repository) {
this.repository = repository;
}
@RequestMapping
String showUsers(Model model, Pageable pageable) {
model.addAttribute("users", repository.findAll(pageable));
return "users";
}
}
- 方法签名中的
pageable
会使得mvc尝试通过如下默认配置去从请求参数中获取一个pageable
实例
page | 0索引,默认为0 |
---|---|
size | 每一页显示的条目数,默认为20 |
sort | 排序依据的属性,默认为升序,可以使用多个sort参数去转换排序方式,例如 ?sort=firstname&sort=lastname,asc. |
- 可以通过各自注册一个实现了
PageableHandlerMethodArgumentResolverCustomizer
或SortHandlerMethodArgumentResolverCustomizer
接口的bean
去自定义分页和排序的规则 - 如下所示,是他们的
customize()
方法被调用了才使得我们可以修改设置.
@Bean SortHandlerMethodArgumentResolverCustomizer sortCustomizer() {
return s -> s.setPropertyDelimiter("<-->");
}
-
如果对于仅仅靠对于已有的
MethodArgumentResolver
设置属性不能满足你的要求,继承SpringDataWebConfiguration
,重写其中的pageableResolver()
和sortResolver()
方法,将@Enable
注解替换为引入你所定义的配置文件 -
如果你需要从请求中解析多个
Pageable
或者sort
例如从多表中获取数据,你可以使用Spring的@Qualifier
注解来区分它们,请求参数前需要加一个${qualifier}_.
,如下面的方法签名中所示
String showUsers(Model model,
@Qualifier("thing1") Pageable first,
@Qualifier("thing2") Pageable second) { … }
-
你需要去构造诸如
thing1_page
和thing2_page
这样的pageable
-
默认的传递进方法的
pageable
对象和PageRequest.of(0,20)
的效果相同,同时,你也可以用@PageableDefault
注解去注解在Pageable
参数上以使用自定义的设定