我有两个实体,它们是多对多关系。
@Entity
public class Room {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToMany(mappedBy = "rooms")
private Set<Team> teams;
}
个字符
为了产生数据,我有一个“房间”和“团队”的存储库:
public interface RoomRepository extends CrudRepository<Room, Long> {
}
public interface TeamRepository extends CrudRepository<Team, Long> {
}
的字符串
我的目标是请求一个团队的所有房间,但防止JPA无限循环。
@RestController
@RequestMapping("....")
public class RoomController {
@Autowired
private RoomRepository roomRepository;
@GetMapping
public Iterable<Room> getAllRoomsOfTeam() {
final long exampleId = 1; //This is just a placeholder. The id will be passed as a parameter.
final var team = teamRepository.findById(exampleId);
return ResponseEntity.ok(team);
}
}
型
这就是结果:
{
"id": 1,
"name": "Team1",
"rooms": [
{
"id": 1,
"name": "Room 1",
"teams": [
{
"id": 1,
"name": "Team 1",
"rooms": [
{
"id": 1,
"name": "Room 1",
"teams": [
型
Jackson将永远循环,直到发生异常(因为反向引用也引用父元素,这将创建一个循环)。我已经尝试过@JsonManagedReference
和@JsonBackReference
,但它们用于多对一关系。
如何阻止Jackson无限循环?我希望尽可能少地影响其他存储库和查询。
2条答案
按热度按时间42fyovps1#
你的控制器不应该返回entities(带有注解@Entity的类)。最好的做法是创建另一个具有相同属性的单独类。这段代码有一点重复,但它保持了所有层的干净。我还建议使用@Service。
字符串
控制器应该返回这个
型
}
How to use DTOs in the Controller, Service and Repository pattern
voase2hg2#
目前,在您的类中存在循环依赖,这导致在将对象转换为
JSON
时出现问题。请在Team
类中的rooms
变量上添加@JsonIgnore
注解,如以下示例所示:字符串
如果你需要一个双向转换的解决方案,那么你可以使用
JsonView
注解。首先,您需要为
Team
和Room
创建JSON视图配置文件,如以下示例所示:型
在实体中使用上面创建的JSON视图配置文件,如下面的示例所示:
的字符串
在将对象转换为JSON时,请使用以下示例中所示的配置文件:
型