关于spring:使用-Spring-Data-Repositories

42次阅读

共计 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” />

正文完
 0