共计 6148 个字符,预计需要花费 16 分钟才能阅读完成。
原题目:Spring 认证 | 应用 Spring Data Repositories(下)起源:(#spring 认证 #Spring 中国教育管理中心)
应用 Spring Data Repositories
对可分页的超媒体反对
Spring HATEOAS 附带了一个示意模型类 (PagedResources),它容许 Page 应用必要的 Page 元数据和链接来丰盛实例的内容,让客户端轻松导航页面。aPage 到 a 的转换 PagedResources 是由 Spring HATEOASResourceAssembler 接口的实现实现的,称为 PagedResourcesAssembler. 以下示例显示了如何应用 aPagedResourcesAssembler 作为控制器办法参数:
示例 51. 应用 PagedResourcesAssembler 作为控制器办法参数
@Controller
class PersonController {
@Autowired PersonRepository repository;
@RequestMapping(value = “/persons”, method = RequestMethod.GET)
HttpEntity persons(Pageable pageable,
PagedResourcesAssembler assembler) {
Page persons = repository.findAll(pageable);
return new ResponseEntity(assembler.toResources(persons), HttpStatus.OK);
}
}
应用 Spring Data Repositories
启用配置,如后面的示例所示,能够 PagedResourcesAssembler 将 用作控制器办法参数。调用 toResources(…)它有以下成果:
的内容 Page 成为 PagedResources 实例的内容。
该 PagedResources 对象 PageMetadata 附加了一个实例,并填充了来自 Page 和底层 的信息 PageRequest。
将 PagedResources 可能会 prev 和 next 连贯链路,依据页面的状态。链接指向办法映射到的 URI。增加到该办法的分页参数与 的设置相匹配,
PageableHandlerMethodArgumentResolver 以确保稍后能够解析链接。
假如咱们 Person 在数据库中有 30 个实例。您当初能够触发申请 () 并看到相似于以下内容的输入:GET
http://localhost:8080/persons
{“links” : [ { “rel” : “next”,
“href” : “http://localhost:8080/persons?page=1&size=20” }
],
“content” : [
… // 20 Person instances rendered here
],
“pageMetadata” : {
“size” : 20,
“totalElements” : 30,
“totalPages” : 2,
“number” : 0
}
}
应用 Spring Data Repositories
组装器生成了正确的 URI 并抉择了默认配置,以将参数解析 Pageable 为行将到来的申请。这意味着,如果您更改该配置,链接将主动恪守更改。默认状况下,汇编器指向调用它的控制器办法,但您能够通过传递一个自定义 Link 来自定义它,该自定义用作构建分页链接的根底,这会重载该
PagedResourcesAssembler.toResource(…) 办法。
Spring Data Jackson 模块
外围模块和一些特定于商店的模块附带一组 Jackson 模块,用于 Spring Data 域应用的类型,例如
org.springframework.data.geo.Distance 和 org.springframework.data.geo.Point。
一旦启用 Web 反对并可用,
com.fasterxml.jackson.databind.ObjectMapper 就会导入这些模块。
在初始化期间 SpringDataJacksonModules,像 一样
SpringDataJacksonConfiguration,被基础设施接管,以便申明的 com.fasterxml.jackson.databind.Modules 可供 Jackson 应用 ObjectMapper。
以下域类型的数据绑定混合由公共根底构造注册。
org.springframework.data.geo.Distanceorg.springframework.data.geo.Pointorg.springframework.data.geo.Boxorg.springframework.data.geo.Circleorg.springframework.data.geo.Polygon
单个模块可能会提供额定的 SpringDataJacksonModules.
无关更多详细信息,请参阅商店特定局部。
网页数据绑定反对
您能够应用 Spring Data 投影(在 Projections 中形容)通过应用 JSONPath 表达式(须要 Jayway JsonPath 或 XPath 表达式(须要 XmlBeam)来绑定传入的申请无效负载,如以下示例所示:
示例 52. 应用 JSONPath 或 XPath 表达式的 HTTP 负载绑定
@ProjectedPayload
public interface UserPayload {
@XBRead(“//firstname”)
@JsonPath(“$..firstname”)
String getFirstname();
@XBRead(“/lastname”)
@JsonPath({“$.lastname”, “$.user.lastname”})
String getLastname();
}
应用 Spring Data Repositories
能够应用在后面的例子中为一个 Spring MVC 处理程序办法参数或通过应用所示类型
ParameterizedTypeReference 上的办法之一 RestTemplate。后面的办法申明将尝试查找 firstname 给定文档中的任何地位。该 lastnameXML 查问是对输出文档的顶层进行。其 JSON 变体 lastname 首先尝试顶级,但如果前者不返回值,也会尝试 lastname 嵌套在 user 子文档中。这样,无需客户端调用公开的办法(通常是基于类的无效负载绑定的毛病)即可轻松加重源文档构造的更改。
如 Projections 中所述,反对嵌套投影。如果该办法返回简单的非接口类型,ObjectMapper 则应用 Jackson 来映射最终值。
对于 Spring MVC,必要的转换器一旦 @
EnableSpringDataWebSupport 处于活动状态就会主动注册,并且所需的依赖项在类门路上可用。对于应用 RestTemplate,注册 ProjectingJackson2HttpMessageConverter(JSON)或 XmlBeamHttpMessageConverter 手动。
无关更多信息,请参阅标准 Spring 数据示例存储库中的 Web 投影示例。
Querydsl 网络反对
对于那些具备 QueryDSL 集成的商店,您能够从 Request 查问字符串中蕴含的属性派生查问。
思考以下查问字符串:
?firstname=Dave&lastname=Matthews
给定 User 后面示例中的对象,您能够应用 将查问字符串解析为以下值
QuerydslPredicateArgumentResolver,如下所示:
QUser.user.firstname.eq(“Dave”).and(QUser.user.lastname.eq(“Matthews”))
@
EnableSpringDataWebSupport 当在类门路上找到 Querydsl 时,会主动启用该性能以及。
将 a 增加 @QuerydslPredicate 到办法签名提供了一个随时可用的 Predicate,您能够应用
QuerydslPredicateExecutor.
类型信息通常从办法的返回类型解析。因为该信息不肯定与域类型匹配,因而应用 的 root 属性可能是一个好主见 QuerydslPredicate。
以下示例显示了如何 @QuerydslPredicate 在办法签名中应用:
@Controller
@Controller
class UserController {
@Autowired UserRepository repository;
@RequestMapping(value = “/”, method = RequestMethod.GET)
String index(Model model, @QuerydslPredicate(root = User.class) Predicate predicate,
Pageable pageable, @RequestParam MultiValueMap parameters) {
model.addAttribute(“users”, repository.findAll(predicate, pageable));
return “index”;
}
}
应用 Spring Data Repositories
将查问字符串参数解析为匹配 Predicatefor User。
默认绑定如下:
Object 在简略的属性上 eq。
Object 在像属性一样的汇合上 contains。
Collection 在简略的属性上 in。
您能够通过 Java 8 的 bindings 属性 @QuerydslPredicate 或通过应用 Java 8default methods 并将 QuerydslBinderCustomizer 办法增加到存储库接口来自定义这些绑定,如下所示:
interface UserRepository extends CrudRepository,
QuerydslPredicateExecutor,
QuerydslBinderCustomizer {
@Override
default void customize(QuerydslBindings bindings, QUser user) {
bindings.bind(user.username).first((path, value) -> path.contains(value))
bindings.bind(String.class)
.first((StringPath path, String value) -> path.containsIgnoreCase(value));
bindings.excluding(user.password);
}
}
应用 Spring Data Repositories
QuerydslPredicateExecutor 提供对特定 finder 办法的拜访 Predicate。
QuerydslBinderCustomizer 存储库界面上定义的主动拾取和快捷方式 @QuerydslPredicate(bindings=…)。
将 username 属性的绑定定义为简略 contains 绑定。
将 String 属性的默认绑定定义为不辨别大小写的 contains 匹配。
password 从 Predicate 解析中排除该属性。
你能够注册一个
QuerydslBinderCustomizerDefaults 从资源库或利用特定的绑定之前豆放弃默认 Querydsl 绑定 @QuerydslPredicate。
4.8.3. 存储库填充器
如果您应用 Spring JDBC 模块,您可能相熟 DataSource 应用 SQL 脚本填充 a 的反对。存储库级别上也有相似的形象,只管它不应用 SQL 作为数据定义语言,因为它必须与存储无关。因而,填充器反对 XML(通过 Spring 的 OXM 形象)和 JSON(通过 Jackson)来定义用于填充存储库的数据。
假如您有一个蕴含 data.json 以下内容的文件:
示例 53. JSON 中定义的数据
[{ “_class” : “com.acme.Person”,
“firstname” : “Dave”,
“lastname” : “Matthews” },
{“_class” : “com.acme.Person”,
“firstname” : “Carter”,
“lastname” : “Beauford” } ]
您能够应用 Spring Data Commons 中提供的存储库命名空间的 populator 元素来填充存储库。要将后面的数据填充到您的 PersonRepository,请申明一个相似于以下内容的填充器:
示例 54. 申明一个 Jackson 存储库填充器
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:repository=”http://www.springframework.org/schema/data/repository”
xsi:schemaLocation=”http://www.springframework.org/schema/beans
https://www.springframework.o…
http://www.springframework.or…
https://www.springframework.o…d”>
后面的申明导致 data.json 文件被 Jackson 读取和反序列化 ObjectMapper。
JSON 对象解组到的类型是通过查看_classJSON 文档的属性来确定的。基础架构最终会抉择适合的存储库来解决反序列化的对象。
要改为应用 XML 定义应填充存储库的数据,您能够应用该 unmarshaller-populator 元素。您将其配置为应用 Spring OXM 中可用的 XML marshaller 选项之一。无关详细信息,请参阅 Spring 参考文档。以下示例显示了如何应用 JAXB 解组存储库填充器:
示例 55. 申明解组存储库填充器(应用 JAXB)
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:repository=”http://www.springframework.org/schema/data/repository”
xmlns:oxm=”http://www.springframework.org/schema/oxm”
xsi:schemaLocation=”http://www.springframework.org/schema/beans
https://www.springframework.o…
http://www.springframework.or…
https://www.springframework.o…
http://www.springframework.or…
https://www.springframework.o…d”>
unmarshaller-ref=”unmarshaller” />