当前位置: 首页 > 面试题库 >

Spring MVC 3:将Spring-Data Page返回为JSON

龚沛
2023-03-14
问题内容

我有一个用Spring-Data制作的数据访问层。我现在正在其上创建一个Web应用程序。这个控制器方法应返回一个格式为JSON 的Spring-Data
Page

这样的页面是带有附加分页信息(例如记录总数等)的列表。

那可能吗?如果可以,怎么办?

与之直接相关的是,我可以定义属性名称的映射吗?例如。这意味着我需要定义如何在JSON中(与页面中不同)命名页面信息属性。这有可能吗?


问题答案:

Spring HATEOAS和Spring Data Commons中将支持这种情况。Spring
HATEOAS附带了一个PageMetadata对象,该对象本质上包含与a 相同的数据,Page但执行方式较少,因此可以更轻松地将其编组和拆组。

我们将其与Spring HATEOAS和Spring Data
commons结合实现的原因的另一方面是,仅对页面,其内容和元数据进行封送处理并没有价值,但是还希望生成指向可能存在的下一页或上一页的链接,因此客户端不必构造URI即可遍历这些页面本身。

一个例子

假设一个域类Person

class Person {

  Long id;
  String firstname, lastname;
}

以及相应的存储库:

interface PersonRepository extends PagingAndSortingRepository<Person, Long> { }

现在,您可以公开一个Spring MVC控制器,如下所示:

@Controller
class PersonController {

  @Autowired PersonRepository repository;

  @RequestMapping(value = "/persons", method = RequestMethod.GET)
  HttpEntity<PagedResources<Person>> persons(Pageable pageable, 
    PagedResourcesAssembler assembler) {

    Page<Person> persons = repository.findAll(pageable);
    return new ResponseEntity<>(assembler.toResources(persons), HttpStatus.OK);
  }
}

这里可能有很多解释。让我们逐步进行:

  1. 我们有一个Spring MVC控制器,将存储库连接到其中。这需要设置Spring Data(通过@Enable(Jpa|Mongo|Neo4j|Gemfire)RepositoriesXML等效项)。该controller方法映射到/persons,这意味着它将接受GET对该方法的所有请求。
  2. 从该方法返回的核心类型是a PagedResources-Spring HATEOAS的类型,它表示一些内容中带有Links加号的内容PageMetadata
  3. 调用该方法时,Spring MVC将必须为Pageable和创建实例PagedResourcesAssembler。为了使此工作正常进行,您需要通过@EnableSpringDataWebSupport即将在Spring Data Commons里程碑中引入的注释或通过独立的bean定义(在此处记录)来启用Spring Data Web支持。

Pageable会从请求信息来填充。默认配置将转向?page=0&size=10Pageable由10个页面大小请求的第一页。

PageableResourcesAssembler让你轻松转Page成一个PagedResources实例。它将不仅将页面元数据添加到响应中,还将根据您访问的页面以及如何Pageable配置分辨率将适当的链接添加到表示中。

为JPA启用此功能的示例JavaConfig配置如下所示:

@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@EnableJpaRepositories
class ApplicationConfig {

  // declare infrastructure components like EntityManagerFactory etc. here
}

样本请求和响应

假设Persons数据库中有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
  }
}

请注意,汇编器生成了正确的URI,并且还采用了当前的默认配置来将参数解析Pageable为即将到来的请求。这意味着,如果您更改该配置,则链接将自动遵守更改。默认情况下,汇编器指向调用该方法的控制器方法,但可以通过传递一个自定义Link来对其进行自定义,该自定义用作构建该PagedResourcesAssembler.toResource(…)方法重载的分页链接的基础。

外表

这些PagedResourcesAssembler位将在Spring Data Babbage
发布系列的即将发布的里程碑版本中提供。当前快照中已提供该功能。您可以在我的Spring RESTBucks
示例应用程序中看到一个有效的示例。只需将其克隆,运行mvn jetty:run并卷曲即可http://localhost:8080/pages



 类似资料:
  • 问题内容: 我有一个用Spring-Data制作的数据访问层。我现在正在其上创建一个Web应用程序。这个控制器方法应返回一个格式为JSON 的Spring-Data Page 。 这样的页面是带有附加分页信息(例如记录总数等)的列表。 这可能吗?如果可以,怎么办? 与之直接相关的是,我可以定义属性名称的映射吗?例如。这意味着我需要定义如何在JSON中(与页面中不同)命名页面信息属性。这有可能吗?

  • 我有一个Oracle数据库,用简体中文存储一些数据值。我创建了一个ASP.NET MVC C#网页,该网页应该显示此信息。我正在使用来检索数据,但是当我运行命令时,值返回为“?” 有数据,但所有被认为是汉字的东西只是一系列“??????”

  • 问题内容: 我有一个javascript函数,该函数调用通用函数对服务器进行ajax调用。我需要从ajax调用的回调函数中检索结果(true / false),但是我得到的结果始终是’undefined’。 如果没有我的全部逻辑,泛型函数的超级简化版本将是: 调用它的函数将类似于: “结果”变量始终为“未定义”,并且对其进行调试,我可以看到正在执行回调函数的“返回真”行。 为什么会这样?如何将返回

  • 我能够毫无问题地从一个定制的java对象返回一个jsonp(如下所示:http://www . concrete page . com/spring-4/spring-4-MVC-JSONP-example-with-rest-response body-response entity),但是当我试图在JSONP中返回一个字符串时,包装函数消失了 我正在做的事情: 呼叫服务: 退货: 预期结果:

  • 问题内容: 我在web.py中玩一个小型Web应用程序,并且正在设置一个URL以返回JSON对象。使用python将SQL表转换为JSON的最佳方法是什么? 问题答案: 就个人而言,我更喜欢使用SQLObject进行此类操作。我改编了一些必须快速完成的测试代码:

  • 问题内容: 我正在尝试检索JSON对象(我已验证的文件格式正确)中的数据,并将数据输出到firebug控制台中。我使用JSONLint(http://jsonlint.com/)验证了JSON,并且知道数据没有在JSON对象中返回,因为当我记录它时,它是以文本而不是对象的形式记录的。当我查看ajax帖子时,有一个JSON选项卡,其中显示了该对象,出于某种原因,我只是无法检索它。 我的ajax电话是

  • 我有一个Spring Boot应用程序(2.4.1),其中字段作为浮点值从返回。示例: 我尝试了这个线程中所有建议的解决方案。他们都不为我工作。 我还尝试添加一个非常简单的endpoint,它只返回: 结果是一样的,它作为浮点值返回。 然后我在一个最小的Spring Boot项目中尝试了相同的终点,它按预期以ISO格式返回: 这一切都指向了一些传递依赖,使Sprint Boot使用的默认Jacks

  • 问题内容: 怎么转换成?如果应该这样做 那怎么算呢? 以及如何转换为? 问题答案: 缓冲区长度为frameCapacity * bytesPerFrame。以下是可以在NSData和AVAudioPCMBuffer之间进行转换的函数。