Spring Data Rest---projection    (投射,投影)

对应spring-data-rest-reference 的第8.1章

当一个实体类含有另一个实体类的对象时

@Entity
public class Person{@Id @GeneratedValueprivate Long id;private String firstName, lastName;@OneToOneprivate Address address;…
}

接口:

interface PersonRepository extends CrudRepository<Person, Long> {}

address相当于一个链接,连接到另外一个名为Adrress的表,

但是在使用到Person的对象时,不一定能识别到address属性,Rest中有两种方法让address能被识别:

第一种,和Person一样增加一个Address的Repository

interface AddressRepository extends CrudRepository<Address, Long> {}

这种情况下,Person会把address当作一个子链接,链接到当前Person对象的address属性对应的Address表中的对象。ex.

{"firstName" : "Frodo","lastName" : "Baggins","_links" : {"self" : {"href" : "http://localhost:8080/persons/1"},"address" : {"href" : "http://localhost:8080/persons/1/address"}
}
}

这里可以看到address属性内容是一个链接,此链接是person链接的子链接,在浏览器输入此链接访问时就可以直接访问到此person的address内容。

第二种,如果没有定义Address自己的Repository,那么Person会把address的内容嵌入到Person的address属性中,作为person对象的一个字段内容。

{"firstName" : "Frodo","lastName" : "Baggins","address" : {"street": "Bag End","state": "The Shire","country": "Middle Earth"},"_links" : {"self" : {"href" : "http://localhost:8080/persons/1"}
}
}

那么问题来了:

问题1--如果我在person中不想要address的具体内容呢?

也就是说在Person类中有address这个属性,但是并不想要它的内容,那就要用到Projection了,如

@Projection(name= "noAddresses",types= { Person.class }) ①
interface NoAddresses{ ②String getFirstName(); ③String getLastName(); ④
}

① 这里的name属性是Projection的名字,types表示这个Projection只提供给Person类型的对象,在访问的时候也只能通过Person对象访问到这个Projection。

NoAddresses接口中只只有FirstName和LastName的getter方法,说明它不会提供任何address的信息。假如现在你定义了一个Address的Repository,Rest提供的Person对象的内容会有所不同,如下:

{"firstName" : "Frodo","lastName" : "Baggins","_links" : {"self" : {"href" : "http://localhost:8080/persons/1{?projection}", ①"templated" : true},"address" : {"href" : "http://localhost:8080/persons/1/address"}
}
}

可以看到这里的链接发生了变化,这里多加的一个条件是{?projection},说明可以添加projection的方式去访问此对象,比如:

http://localhost:8080/persons/1?projection=noAddresses

这里的projection的值noAddresses要和@Projection(name = "noAddress")中的name值要相同。

问题2--那一个Person类可以有多个@Projection吗?

答案是:可以的!可以设置多个@Projection

问题3--Spring Data Rest怎么寻找@Projection注解?

答案是:和实体类在同一个包下或者子包下的 @Projection都会被扫描到,并注册到Bean中。另外,也可以人工注册@Projection,这样的方式是通过

RepositoryRestConfiguration.projectionConfiguration().addProjection(…).

实现的。

不管是哪种情况,必须要在接口中添加@Projection注解。

Spring Data Rest学习篇----@Projection相关推荐

  1. Spring Data MongoDB 学习和使用

    1.准备环境 新建一个Springboot项目 点击finish完成项目的搭建 2.配置连接参数 # application.properties # 配置数据库连接 #格式: mongodb://账 ...

  2. [Spring Data MongoDB]学习笔记--建立数据库的连接

    1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoD ...

  3. 使用H2Database+Druid连接池+Spring Data JPA+Ehcache实现CRUD操作

    前言 注:本篇为纯实践篇,主要用于技术整合,介绍如何搭建一个完整全面的Web项目.如果对于技术原理还不了解的童鞋可点击下方链接,学习后在来~ H2数据库教程:H2数据库入门 缓存使用教程:在Sprin ...

  4. 一步步学习 Spring Data 系列之JPA(一)

    2019独角兽企业重金招聘Python工程师标准>>> 大概有半年多没有写博客了,主要是最近忙于工作,也没来得及与大家分享技术.当然现在的技术大多都有人写其博客分享了,也找不到合适写 ...

  5. 学习Spring Data JPA

    简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特​​殊 ...

  6. Spring Data JPA简单学习

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  7. Spring Data Commons 官方文档学习

    Spring Data Commons 官方文档学习   -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...

  8. 【SpringBoot框架篇】11.Spring Data Jpa实战

    文章目录 1.简介 1.1.JPA 1.2.Spring Data Jpa 1.3.Hibernate 1.4.Jpa.Spring Data Jpa.Hibernate三者之间的关系 2.引入依赖 ...

  9. SpringBoot学习笔记:Spring Data Jpa的使用

    更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...

  10. Spring Web Service 学习之Hello World篇

    http://fuxueliang.iteye.com/blog/175184 Spring Web Service是Spring社区基于Spring提供的一个关注于创建"文档驱动" ...

最新文章

  1. Putdb WebBuilder 6.5 正式版本发布
  2. Python 和 C/C++ 拓展程序的性能优化
  3. Go语言的分词器(sego)
  4. linux磁盘格式化
  5. android oreo_Android Oreo画中画
  6. 8.XSD 复合元素
  7. X波段卡塞格伦天线设计与仿真
  8. 2021年 阿里云商标注册申请的相关详情及分类介绍
  9. 教程篇(7.0) 10. FortiGate安全 反病毒 ❀ Fortinet 网络安全专家 NSE 4
  10. 钢琴家以前是学计算机的,奇特的钢琴家——裘元朴
  11. CSS(持续更新。。)
  12. 面试题:1、H5+css
  13. 2019长三角科技金融峰会召开 链塔CEO张翔分享区块链应用前景
  14. 推荐系统学习笔记——四、Netfilx经典推荐系统架构
  15. django 用户授权与许可
  16. STM8使用SPI通信需要注意的几个问题
  17. 永磁同步电机(PMSM)
  18. 心态-《自卑与超越》书中的精髓:我们为什么会感到自卑,以及如何做才能克服自卑情绪。
  19. Windows平台下Mediasoup客户端开发指南
  20. 「人形机器人」赛博梦碎,资本不为想象力买单

热门文章

  1. 类和对象7:构造和析构方法
  2. python从键盘输入一个字符串将小_python如何从键盘获取输入实例
  3. markdown生成目录
  4. 杰里之2M 包加入来电铃声和来电报号的问题【篇】
  5. 人生这么短,哪有空嫌晚
  6. 计算机专业英语中常见的前缀和后缀,专业英语词根与前后缀.ppt
  7. 注射php,手工注射php学习
  8. pandas按行、按列合并数据
  9. c#-winform自定义窗体皮肤(无边框皮肤)
  10. 2017开发者技术和薪酬调查报告