Spring Data REST的实际应用

什么是春天数据休息?

spring-data-restspring-data项目的新增功能,它是一个框架,可帮助您将实体直接作为RESTful Web服务端点公开。 与rails,grails或roo不同,它不会生成任何实现此目标的代码。 spring data-rest支持JPA,MongoDB,JSR-303验证, HAL等。 它确实具有创新性,可让您在几分钟内设置RESTful Web服务。 在此示例中,我将简要概述spring-data-rest的功能。

初始配置

我将使用新的Servlet 3 Java Web Configuration而不是古老的web.xml。 这里没什么特别的。

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{AppConfiguration.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfiguration.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

GitHub上的WebAppInitializer.java

我正在将hibernate初始化为AppConfiguration类中的数据库抽象层。 我使用的是嵌入式数据库( hsql ),因为我想使此演示文稿保持简单愚蠢。 不过,这里没有什么特别的。

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
public class AppConfiguration {

    @Bean
    public DataSource dataSource() {
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.HSQL).build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.HSQL);
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan(getClass().getPackage().getName());
        factory.setDataSource(dataSource());

        return factory;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }
}

github上的AppConfiguration.java

现在到应用程序servlet配置: WebConfiguration

@Configuration
public class WebConfiguration extends RepositoryRestMvcConfiguration {
}

github上的WebConfiguration.java

哦,那有点短吧? 完整的安装程序不需要一行代码。 这是约定优于配置范式的一个非常好的应用。 现在,我们可以开始创建spring-data-jpa存储库,因为它们将自动显示为RESTful资源。 而且,如果需要,我们仍然可以将自定义配置添加到WebConfiguration类。

初始化真的很简单。 我们不必编写任何特殊的代码。 我们唯一要做的就是建立数据库连接和休眠,这显然是不可避免的。 现在,我们已经设置了“ REST Servlet”和持久性,让我们从模型开始进入应用程序本身。

该模型

我将仅创建两个相关的实体,使其保持非常简单的状态。
bookapi_model

@Entity
public class Book {

    @Id
    private String isbn;

    private String title;

    private String language;

    @ManyToMany
    private List<Author> authors;

}

GitHub上的Book.java

@Entity
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;

    private String name;

    @ManyToMany(mappedBy = "authors")
    private List<Book> books;

}

github上的Author.java

为了最终使实体持久化并作为RESTful Web服务公开,我们需要spring-data存储库。 存储库基本上是DAO 。 它为我们的实体提供CRUD功能。 spring-data消除了创建此类存储库的大部分编程工作。 我们只需要定义一个空接口,spring-data即可完成其他所有工作。 尽管如此,由于其设计优于配置,因此易于定制。

实际仓库

@RestResource(path = "books", rel = "books")
public interface BookRepository extends PagingAndSortingRepository<Book, Long> {
}

GitHub上的BookRepository.java

@RestResource(path = "authors", rel = "authors")
public interface AuthorRepository extends PagingAndSortingRepository<Author, Integer> {
}

GitHub上的AuthorRepository.java

同样,几乎不需要代码。 甚至@RestResource注释也可以被忽略。 但是,如果我这样做了,路径和rel将以我不想要的实体命名。 但是,包含多个子项的REST资源应命名为复数。

访问结果

我们的RESTful Web服务现在可以部署了。 运行后,它将在根目录上列出所有可用资源,因此您可以从那里导航。

获取http:// localhost:8080 /

{
  "links" : [ {
    "rel" : "books",
    "href" : "http://localhost:8080/books"
  }, {
    "rel" : "authors",
    "href" : "http://localhost:8080/authors"
  } ],
  "content" : [ ]
}

精细! 现在让我们创建一个作者和一本书。

POST http:// localhost:8080 / authors

{"name":"Uncle Bob"}

响应

201 Created
Location: http://localhost:8080/authors/1

放置http:// localhost:8080 / books / 0132350882

{
  "title": "Clean Code",
  "authors": [
      {
          "rel": "authors",
          "href": "http://localhost:8080/authors/1"
      }
  ]
}

响应

201 Created

注意到我是如何使用PUT创建书的? 这是因为其ID是实际的isbn。 我必须告诉服务器要使用哪个isbn,因为他无法猜测。 我为作者使用了POST,因为他的ID只是自动生成的一个增量数字。 另外,我使用了一个链接来连接这本书( / books / 0132350882 )和作者( / authors / 1 )。 基本上,这就是超媒体的全部意义:链接用于实体之间的导航和关系。

现在,让我们看看这本书是否是相应创建的。

GET http:// localhost:8080 / books

{
  "links" : [ ],
  "content" : [ {
    "links" : [ {
      "rel" : "books.Book.authors",
      "href" : "http://localhost:8080/books/0132350882/authors"
    }, {
      "rel" : "self",
      "href" : "http://localhost:8080/books/0132350882"
    } ],
    "title" : "Clean Code"
  } ],
  "page" : {
    "size" : 20,
    "totalElements" : 1,
    "totalPages" : 1,
    "number" : 1
  }
}

精细!

这是一个集成测试,将自动执行以下步骤。 它也可以在github的示例中找到。

public class BookApiIT {

    private final RestTemplate restTemplate = new RestTemplate();

    private final String authorsUrl = "http://localhost:8080/authors";
    private final String booksUrl = "http://localhost:8080/books";

    @Test
    public void testCreateBookWithAuthor() throws Exception {
        final URI authorUri = restTemplate.postForLocation(authorsUrl, sampleAuthor()); // create Author

        final URI bookUri = new URI(booksUrl + "/" + sampleBookIsbn);
        restTemplate.put(bookUri, sampleBook(authorUri.toString())); // create Book linked to Author

        Resource<Book> book = getBook(bookUri);
        assertNotNull(book);

        final URI authorsOfBookUri = new URI(book.getLink("books.Book.authors").getHref());
        Resource<List<Resource<Author>>> authors = getAuthors(authorsOfBookUri);
        assertNotNull(authors.getContent());
        assertFalse(authors.getContent().isEmpty()); // check if /books/0132350882/authors contains an author
    }

    private String sampleAuthor() {
        return "{\"name\":\"Robert C. Martin\"}";
    }

    private final String sampleBookIsbn = "0132350882";

    private String sampleBook(String authorUrl) {
        return "{\"title\":\"Clean Code\",\"authors\":[{\"rel\":\"authors\",\"href\":\"" + authorUrl + "\"}]}";
    }

    private Resource<Book> getBook(URI uri) {
        return restTemplate.exchange(uri, HttpMethod.GET, null, new ParameterizedTypeReference<Resource<Book>>() {
        }).getBody();
    }

    private Resource<List<Resource<Author>>> getAuthors(URI uri) {
        return restTemplate.exchange(uri, HttpMethod.GET, null, new ParameterizedTypeReference<Resource<List<Resource<Author>>>>() {
        }).getBody();
    }
}

GitHub上的BookApiIT.java

结论

我们已经创建了完整的RESTful Web服务,而无需花费很多代码。 我们只是定义了实体和数据库连接。 spring-data-rest表示,其他所有内容都只是样板,我同意。

要手动使用Web服务,请考虑rest-shell 。 它是一个命令外壳,它使您的Web服务中的导航尽可能轻松有趣。 这是屏幕截图:
rest_shell
完整的示例可以在我的github上找到 https://github.com/gregorriegler/babdev-spring/tree/master/spring-data-rest https://github.com/gregorriegler/babdev-spring

参考:成为更好的开发者”博客上的JCG合作伙伴 Gregor Riegler提供的Spring Data REST in Action

翻译自: https://www.javacodegeeks.com/2013/08/spring-data-rest-in-action.html

自动生成RESTful API——Spring Data Rest ○ 虽然 Spring Data REST 可以自动暴露仓库方法,但你仍然可以添加自定义控制器来处理特定的业务逻辑。你可以通过 @RepositoryRestResource 注解来自定义仓库的暴露方式。创建一个自定义的认证提供者,用于处理认证逻辑。 阅读详情

相关推荐

Spring Data REST什么的

通过使用Spring Data REST,开发者能够快速地将数据访问层自动转换为功能完整的REST API,从而使得在前后端分离的架构风格中,前端开发者或移动应用开发者能够轻松地使用这些API。Spring Data REST提供的超媒体驱动的API符合REST架构风格,可以极大地提高开发效率,并减少重复工作。

java永无止境! 1828

探索Spring Data REST在后端生物识别技术集成中的应用

本文章的主要目的是深入探讨如何将Spring Data REST应用于后端生物识别技术的集成。随着生物识别技术在各个领域的广泛应用,如安全访问控制、身份验证等,将其与后端服务进行高效集成变得至关重要。Spring Data REST作为一个强大的框架,能够简化RESTful API的开发,提高开发效率。本文将详细介绍集成的原理、步骤和实际应用,范围涵盖从理论知识到项目实战的各个方面。本文将按照以下结构进行阐述:首先介绍核心概念与联系,让读者了解生物识别技术和Spring Data REST的基本原理和架构。

架构师的AI之路,分享AI应用开发架构的学习与实践。 996

Spring Data REST为后端领域注入新活力

Spring Data RESTSpring生态系统中的重要组件,旨在简化RESTful API的开发过程。本文旨在全面解析该框架的工作原理、核心特性以及实际应用场景,帮助开发者理解如何利用它提升后端开发效率。文章将从基础概念入手,逐步深入到实现原理和实战应用,最后探讨扩展话题和未来趋势。每个章节都包含详细的技术分析和实践指导。:基于Spring DataRESTful API自动生成框架HATEOAS。

欢迎来到我的CSDN空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 1429

Spring Data Rest 指南

Spring Data Rest 一.Restful简介 REST是一种Web软件结构风格,而不是一种标准,匹配或兼容这种架构风格称之为REST服务,REST服务简洁并且有层次,REST通常基于HTTP,URI和XML以及HTML这些现有的广泛流行的协议和标准,在REST中,资源是由URI来指定的,对资源的增删改查也是通过HTTP协议提供的POST,PUT,GET,DELETE等方法实现,使用REST可以更高效率的利用缓存来提高响应速度,同时REST中的通信会话状态有客户端来维护,这可以让不同服务器来处理一

ToBeMaybe_的博客 3092

Spring Data REST

一 点睛 1 什么是Spring Data REST Spring Data JPA是基于Spring Data的Repository之上,可以将Repository自动输出为REST资源。目前Spring Data REST支持将Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j、Spring Data Gemfire以及Spring ...

实践求真知 1481

Java开发】 Spring 09 :Spring Data REST 实现并访问简单的超媒体服务

Spring Data REST 是提供一个灵活和可配置的机制来编写可以通过HTTP公开的简单服务,简单来说,而且可以省去大部分controller和services的逻辑,因为Spring Data REST 已经为你都做好了,目前支持JPA、MongoDB、Neo4j、Solr、Cassandra 和 Gemfire,因此本文以 JPA 举例。

尹煜的博客 1742

Spring Data REST助力后端开发实现快速迭代

Spring Data REST是现代后端开发的强力加速器,它通过自动化API生成大幅减少样板代码编写。本文旨在全面解析这一框架的工作机制,展示其在实际项目中的应用价值,并提供最佳实践指南。本文将首先解析框架核心概念,然后深入架构实现,接着通过完整项目示例展示实际应用,最后讨论性能优化和扩展方案。资源(Resource):REST架构中的核心数据单元Repository:数据访问层的抽象接口HATEOAS:超媒体作为应用状态引擎的REST约束与GraphQL的集成响应式编程支持云原生特性增强。

欢迎来到我的CSDN空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 758

探秘Spring Data REST在后端架构中的应用

Spring Data RESTSpring框架的一个重要组成部分,其主要目的是为了简化基于RESTful风格的Web服务开发。在传统的后端架构开发中,开发人员需要花费大量的时间和精力来编写RESTful API的代码,包括请求处理、数据转换、资源映射等。Spring Data REST的出现,使得开发人员可以基于Spring Data的仓库接口,自动生成RESTful API,大大提高了开发效率。

欢迎来到我的CSDN空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 867

Spring Data Rest!五分钟帮我们实现Rest服务

Spring Data Rest!几分钟帮我们实现Rest服务 一、概述 一直认为,Spring Data是与第三方组件进行数据交换的全家桶的整合,比如Spring Data Jpa是数据库使用,Spring Data LDAP是LDAP的使用,Spring Data Redis是Redis的使用,Spring Data Elasticsearch是Elasticsearch的使用。 然而,不起眼...

feiyangtianyao的专栏 1134

Spring data rest

spring-data-rest的详细讲解 一、基本配置和环境 1. 所用的环境: idea jdk 1.8 mysql 5.7 maven 3.3.9 postman … 2. 创建springboot工程:(idea直接创建) 2.1. pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http...

itman_cx的博客 593

Spring Data REST快速入门:构建RESTful服务实践指南

Java Persistence API (JPA) 是一种规范,提供了对象关系映射(ORM)技术的标准方式,用Java对象表示和操作数据库数据。JPA定义了一整套对象-关系映射规则,并提供了一组API用于在Java环境中以面向对象的方式操作数据库。ORM技术的核心在于将数据库表映射为对象,使得开发者可以在Java应用程序中直接操作这些对象,而不需要编写底层的SQL语句。Java Persistence API (JPA) 与 ORM 的关系如下:JPA是规范,ORM是实现。

weixin_42576410的博客 820

Spring实战】21 Spring Data REST 常用功能详细介绍

通过本文的介绍,我们深入了解了 Spring Data REST 的一些常用功能。这些功能大大简化了构建 RESTful API 的过程,提高了开发效率。希望这些示例能够帮助你更好地使用 Spring Data REST 构建强大的 RESTful 服务。

好久不见的流星 1494

Spring Data Rest各种定制操作

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源

泠青沼 1122

SpringBoot学习笔记】SpringDataREST

使用Spring创建REST应用 文章目录使用Spring创建REST应用一、简单创建一个REST应用构建一个简单的REST应用REST应用二、SpringDataREST构建REST应用 一、简单创建一个REST应用 构建一个简单的REST应用 添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web&l

AC_sunK的博客 1119

Spring Data REST 快速构建 RESTful API应用

妈妈再也不用担心我加班 Spring Data REST 快速构建 restful api 应用

Akiler的博客 405

Spring实战】20 Spring Data REST+JPA构建基础的RESTful API

Spring Data RESTSpring Framework 生态系统中的一个组件,它通过提供一套约定和默认配置,简化了使用 SpringJava 构建 RESTful Web 服务的过程。使用它和 JPA(Java Persistence API)结合,我们可以更加轻松地创建强大且易于扩展的 RESTful API。

好久不见的流星 1643

探索Spring Data REST在后端智能合约开发中的应用

本文旨在为开发者提供一套完整的Spring Data REST与智能合约集成的解决方案。Spring Data REST如何简化智能合约后端开发区块链数据与传统数据库的协同工作模式智能合约事件与REST API的集成方法性能优化和安全考虑研究范围涵盖主流区块链平台如以太坊和Hyperledger Fabric,但核心概念可应用于大多数智能合约开发场景。首先介绍核心概念和技术背景深入分析架构设计和集成原理提供详细的代码实现和案例探讨实际应用和优化策略总结未来发展趋势。

欢迎来到我的CSDN空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 1098
上一篇: Java开发人员的Erlang
下一篇: 弹簧可配置魔术
dnc8371
博客等级 码龄11年 421粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值