Spring Data JPA 对于web的基本支持

spring data jpa对于基础的web支持,在使用 @EnableSpringDataWebSupport 后就会获得

  • DomainClassConverter: 可以让springMVC通过请求参数或者路径变量来解析被 repository 管理的实体类对象
  • HandlerMethodArgumentResolver: 可以让springMVC可以从接收的请求参数中解析 Pageablesort 实例

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

  • 默认注册的 PageableHandlerMethodArgumentResolverSortHandlerMethodArgumentResolver 使得 Pageablesort 成为可以在控制器中方法中的有效的参数
@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 实例
page0索引,默认为0
size每一页显示的条目数,默认为20
sort排序依据的属性,默认为升序,可以使用多个sort参数去转换排序方式,例如 ?sort=firstname&sort=lastname,asc.
  • 可以通过各自注册一个实现了 PageableHandlerMethodArgumentResolverCustomizerSortHandlerMethodArgumentResolverCustomizer 接口的 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_pagething2_page 这样的 pageable

  • 默认的传递进方法的 pageable 对象和 PageRequest.of(0,20) 的效果相同,同时,你也可以用 @PageableDefault 注解去注解在 Pageable 参数上以使用自定义的设定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值