从 Spring Boot 控制器返回非 JSON 数据(对象列表)
Posted
技术标签:
【中文标题】从 Spring Boot 控制器返回非 JSON 数据(对象列表)【英文标题】:Returning non JSON data (List of object) from spring boot controller 【发布时间】:2019-01-31 14:02:15 【问题描述】:我正在尝试在我的 Spring Boot 项目中检索 OneToMany 关联。当我从控制器返回 JSON 响应时,它只会得到正常的字符串列表,而不是正确的 JSON。此结果是 JPQL 查询的连接结果,
我这里添加repository方法,
@Query("SELECT ur.userId , r.role FROM Roles r JOIN r.roleJoin ur")
List<Roles> findByRole();
我的控制器有如下代码,
@GetMapping("/check")
public List<Roles> check()
return repoObj.findByRole();
得到这样的回应,
[[2,"A"],[649,"B"],[651,"C"],[653,"A"],[658,"A"],[3,"A"],[1,"B"],[670,"B"]]
好像是一个对象列表,但是默认spring boot控制器会返回JSON格式的数据。但我只得到如下。因为我需要从我的前端 Angular 应用程序访问 JSON。
谁能帮我澄清一下,以正确的 JSON 本身发送响应,而不仅仅是一个列表?
【问题讨论】:
你在控制器上使用@RestController注解死了吗? 是的。我已经有了那个注释 你的角色类是什么样的? @Simon - 我更新了问题 【参考方案1】:问题是您查询中的投影与返回类型不匹配。
您假设您获得了 Roles 类型的对象,但在您的查询中您只选择了 ur.nuserId 和 r.srole_desc
或者将您的查询更改为:
@Query("SELECT r FROM Roles r JOIN r.roleUserMappingJoin ur")
但这和 findAll() 是一样的
或创建一个 DTO 来保存您要返回的数据。
在此处阅读有关投影和 Spring Data JPA 的更多信息:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
【讨论】:
那么我如何根据任何特定条件检索有限数量的行?意味着如果我只需要用户 id = 45 的用户详细信息,那么 JPQL 查询中没有规定要提及? DTO 是什么意思? DTO 代表 Data Transfer Object,是 Martin Fowler 引入的一种企业应用模式:martinfowler.com/eaaCatalog/dataTransferObject.html 而且在使用它之前,您绝对应该学习 JPA 基础知识。有很多书籍和 Java EE 教程。阅读本章:docs.oracle.com/javaee/7/tutorial/… 好的。明白了。所以只有通过 JPQL ,特定的列投影是不可能的? 不,我不是这个意思。但是,如果您像以前那样执行此操作,则返回类型是 List of Object[],这就是 JSON 序列化不会产生您所期望的结果的原因。因此,您需要一个类或接口作为可以序列化为正确 JSON 的返回类型。以上是关于从 Spring Boot 控制器返回非 JSON 数据(对象列表)的主要内容,如果未能解决你的问题,请参考以下文章