从 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 数据(对象列表)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 控制器建议 - 如何返回 XML 而不是 JSON?

返回 JSON 作为响应 Spring Boot

Spring Boot 处理异常返回json

java spring boot返回json的写法

Spring Boot - 返回带有对象数组的 JSON

Spring Boot Rest Controller:返回默认错误 JSON