如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行
Posted
技术标签:
【中文标题】如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行【英文标题】:How to map a nested JSON Object as an SQL table row in Spring Boot 【发布时间】:2020-07-19 07:40:19 【问题描述】:我正在使用 Spring 和 JPA 一起开发 API。我正在处理一个 POST
请求,该请求接受 @RequestBody
作为 JSON 对象,看起来像这样-
"id": "323",
"name": "Sam",
"gpsLocation":
"latitude": 66.7492558,
"longitude": 97.133258
还有一个包含以下列的 SQL User
表-
id | name | latitude | longitude
在 Spring 中有没有办法将这个嵌套的 json 对象直接映射到这些表列?
这就是我的User.java
和GpsLocation.java
实体类现在的样子-
@Table(name = "user")
@Entity
public class UnderObservation
@Column(name = "name", nullable = false)
private String name;
@Id
@Column(name = "id", nullable = false)
private String userID;
private GpsLocation location;
@Entity
public class GpsLocation
@Column(name = "Latitude", nullable = false)
private Double Latitude;
@Column(name = "Longitude", nullable = false)
private Double Longitude;
我正在寻找一种“展平/解包”GpsLocation
类的方法,以便它直接适合User
表,而不是为GpsLocation
提供单独的表。
我无法更改 JSON 结构,因为其他一些无 SQL 数据库正在使用它。另外,我是 Spring 新手!
【问题讨论】:
【参考方案1】:这里的最佳做法是使用包含request body
的DTO
数据传输对象
并使用mapstruct
、ObjectMapper
等外部库将其映射到user
对象,甚至手动进行
DTO 是一个 pojo 对象,在进程之间携带数据
【讨论】:
【参考方案2】:用构造函数试试这个方法:
@Getter
@Setter
@Table(name = "user")
@Entity
public class UnderObservation
@Column(name = "name", nullable = false)
private String name;
@Id
@Column(name = "id", nullable = false)
private String userID;
@Column(name = "latitude", nullable = false)
private Double latitude;
@Column(name = "longitude", nullable = false)
private Double longitude;
private GpsLocation location;
UnderObservation(String name, String userID, GpsLocation location)
this.name = name;
this.userID = userID;
this.location = location;
this.latitude = this.location.getLatitude();
this.longitude = this.location.getLongitude();
【讨论】:
在 spring 中不起作用,因为它使用 noArgs 构造函数和 setter 进行映射。以上是关于如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Wildfly 中将外部属性文件加载到 Spring Boot
如何在spring boot gradle项目中将时间戳附加到jar?
如何在spring boot中将@Value属性从application.properties注入@InjectMocks?