我正在開發一個springboot應用程式。我有 2 個物體類,組和用戶。我還在 Group 類(擁有物體)和 User 類中定義了 @ManyToMany 關系,這樣我就可以獲取用戶所屬的所有組。不幸的是,由于以下錯誤,我無法創建新組或新用戶;
{
"timestamp": "2022-09-09T20:29:22.606 00:00",
"status": 415,
"error": "Unsupported Media Type",
"message": "Content type 'application/json;charset=UTF-8' not supported"
}
當我嘗試通過呼叫來獲取用戶所屬的所有組時,user.get().getGroups();
我得到一個堆疊溢位錯誤
注意:目前我在 Group 和 User 類中分別有 @JsonManagedReference 和 @JsonBackReference 。我也嘗試添加@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
兩個類,但這也不起作用。如下所示,將 value 引數添加到 @JsonManagedReference 和 @JsonBackReference 也不起作用。我究竟做錯了什么?我錯過了什么?
這是我的Group物體類
@Table(name = "`group`") // <- group is a reserved keyword in SQL
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@JsonView(Views.Public.class)
private String name;
private Integer maximumMembers;
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinTable(name = "group_user", joinColumns = @JoinColumn(name = "group_id"), inverseJoinColumns = @JoinColumn(name = "user_id"))
@JsonView(Views.Public.class)
@JsonManagedReference(value = "group-member")
private Set<User> groupMembers;
}
這是我的用戶物體類
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonView(Views.Public.class)
private Long id;
@JsonView(Views.Public.class)
private String nickname;
@JsonView(Views.Public.class)
private String username; // <- Unique user's phone number
private String password;
@ElementCollection(targetClass = ApplicationUserRole.class)
@CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
@Enumerated(EnumType.STRING)
@Column(name = "role")
private Set<ApplicationUserRole> roles;
@ManyToMany(mappedBy = "groupMembers", fetch = FetchType.LAZY, targetEntity = Group.class)
@JsonBackReference(value = "user-group")
private Set<Group> groups;
}
最小的、可重現的示例https://github.com/Java-Techie-jt/JPA-ManyToMany
uj5u.com熱心網友回復:
我找到了這個問題的永久解決方案。對于其他面臨類似問題的人,這就是我發現的。首先,我的物體類有@Data
Lombok 注釋。我洗掉了這個,因為@Data
注釋有幾乎總是加載集合的趨勢,即使你有FetchType.LAZY
.
你可以在這里閱讀更多關于為什么你不應該注釋你的物體類的@Data
資訊https://www.jpa-buddy.com/blog/lombok-and-jpa-what-may-go-wrong/
洗掉此注釋后,我從關系的雙方(兩個物體)中洗掉了@JsonManagedReference
和。@JsonBackReference
然后我只添加@Jsonignore
到參考端(用戶類)。這解決了兩件事
- 創建一個包含用戶串列的組可以正常作業
- 將用戶串列添加到組中可以正常作業。
在此之后,我們剩下最后一個問題。當我們嘗試從 api 讀取用戶時,我們得到的用戶沒有他們所屬的組的關聯串列,因為我們@JsonIgnore
在用戶串列中。為了解決這個問題,我讓控制器回傳一個新物件。所以從我的服務中獲取用戶后,我將它映射到一個新的資料傳輸物件,我在控制器中回傳這個物件。
從這里我用來@JsonView
過濾我的回復。
這就是我的課程的外觀,注意@Data
注釋中沒有。
團體
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
@Table(name = "`group`") // <- group is a reserved keyword in SQL
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Integer maximumMembers;
@ManyToMany(fetch = FetchType.EAGER,
cascade = {CascadeType.MERGE, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name = "group_user",
joinColumns = @JoinColumn(name = "group_id"),
inverseJoinColumns = @JoinColumn(name = "user_id"))
@JsonView(UserViews.PublicUserDetails.class)
private Set<User> groupMembers = new HashSet<>();
}
用戶
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonView(UserViews.PublicUserDetails.class)
private Long id;
@JsonView(UserViews.PublicUserDetails.class)
private String nickname;
@JsonView(UserViews.PublicUserDetails.class)
private String username; // <- Unique user's phone number
private String password;
@ElementCollection(targetClass = ApplicationUserRole.class)
@CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
@Enumerated(EnumType.STRING)
@Column(name = "role")
@JsonView(UserViews.PublicUserDetails.class)
private Set<ApplicationUserRole> roles;
@JsonIgnore
@ManyToMany(mappedBy = "groupMembers", fetch = FetchType.LAZY, targetEntity = Group.class)
private Set<Group> groups = new HashSet<>();
}
在用戶控制器中獲取用戶的方法
@GetMapping("/get-groups")
public ResponseEntity<UserRequestResponseDTO> getWithGroups(@RequestParam(name = "userId") Long userId) {
User user = userService.getWithGroups(userId);
UserRequestResponseDTO response = UserRequestResponseDTO.builder()
.nickname(user.getNickname())
.username(user.getUsername())
.groups(user.getGroups())
.build();
return ResponseEntity.ok().body(response);
}
希望這可以幫助某人??
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/508392.html