我有一个用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);
}
}
这里可能有很多解释。让我们逐步进行:
@Enable(Jpa|Mongo|Neo4j|Gemfire)Repositories
XML等效项)。该controller方法映射到/persons
,这意味着它将接受GET
对该方法的所有请求。PagedResources
-Spring HATEOAS的类型,它表示一些内容中带有Links
加号的内容PageMetadata
。Pageable
和创建实例PagedResourcesAssembler
。为了使此工作正常进行,您需要通过@EnableSpringDataWebSupport
即将在Spring Data Commons里程碑中引入的注释或通过独立的bean定义(在此处记录)来启用Spring Data Web支持。该Pageable
会从请求信息来填充。默认配置将转向?page=0&size=10
成Pageable
由10个页面大小请求的第一页。
将PageableResourcesAssembler
让你轻松转Page
成一个PagedResources
实例。它将不仅将页面元数据添加到响应中,还将基于您访问的页面以及如何Pageable
配置分辨率将适当的链接html" target="_blank">添加到表示中。
为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
。
问题内容: 有没有一种方法可以将部分呈现为MVC的JSON响应的一部分返回HTML字符串? 问题答案: PartialViewResult和ViewResult都从ViewResultBase派生,因此相同的方法应该对两者都起作用。 使用上面线程中的代码,您将可以使用:
问题内容: 我在Spring Boot中有一个示例RestController: 我正在使用JSON库 当我点击API时,我得到一个异常提示: 路径为[]的Servlet [dispatcherServlet]的Servlet.service()抛出异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:未找到类型为org.json.JSONObject
我在Spring Boot中有一个RestController示例: 我正在使用JSON库 当我点击API时,我得到一个异常: 路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[请求处理失败;嵌套异常为java.lang.IllegalArgumentException:没有找到具有根本原因的返回值:class org.json.
问题内容: 我的问题实质上是对该问题的后续行动。 在上面,Spring将“ Hello World”添加到响应正文中。如何返回字符串作为JSON响应?我知道我可以添加引号,但这感觉更像是黑客。 请提供任何示例以帮助解释此概念。 注意:我不希望将其直接写到HTTP响应正文中,我想以JSON格式返回字符串(我将控制器与RestyGWT一起使用,这要求响应必须为有效JSON格式)。 问题答案: 返回(例
从rest服务抛出的异常以某种方式返回为JSON是否可能?我有一个JAX-RS Rest服务来实现这一点。当我现在抛出它时,它被映射到一个HTML响应,这不是我想要的。据我所知,ExceptionMapper也会将其映射到HTML?是否有其他可供选择的或库允许以JSON格式返回异常?