【发布时间】:2024-09-16 10:35:01
【问题描述】:
您好,我对带有延迟加载的 Spring 和 Mongo 有一些问题。
我有这个配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
本文档:
@Document
public class User {
@Id
private String id;
@DBRef
private Place place;
@DBRef(lazy=true)
private Country country;
.
.
.
}
一切正常,但是当我在 RestController 中公开“用户”时,例如:
@RestController
public class UserController {
.
.
.
@RequestMapping(value = "user/{idUser}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public User getById(@PathVariable("idUser") String idUser){
return userService.getById(idUser);
}
}
输出是:
{
"id": "58ebf11ee68f2751f33ae603",
"place": {
"id": "58e3bf76e76877586435f5af",
"name": "Place X"
},
"country": {
"id": "58daa782e96139070bbc851c",
"name": "México",
"target":{
"id": "58daa782e96139070bbc851c",
"name": "México",
}
}
}
问题:
如果“country”标记为“lazy=true”,为什么会打印出来?
为什么“国家”中有一个名为“目标”的新字段?
如何避免序列化标记为“lazy=true”的字段?
提前感谢您的帮助。
【问题讨论】:
-
我认为 spring-data 对 mongo 的延迟加载与 Jackson 配合得不好。 Jackson 可能使用反射,而 spring-data 延迟加载使用 CGLIB 代理对象,这可能会破坏 Jackson 在 Spring(Jackson 的)序列化到 json 中的任何反射操作。
-
你解决过这个问题吗?
-
@DavidA 不,我没有,但我改变了返回数据的方式。我认为正确的方法是返回一个 DTO 而不是直接暴露实体或 mongo 文档。
-
我遇到了 json-patch 的目标类未知的错误。我没有办法,只能选择lazy=false
-
@Merch0 你找到问题 1 的答案了吗?
标签: java spring-mvc spring-boot spring-data spring-data-mongodb