我有一個名為 SubmittedQuiz 的物件,它由 Quiz 物件、User 物件和 submitQuestions 物件組成。
當我嘗試執行此請求時:
GET http://localhost:8080/SubmittedQuiz/getForUser/10
我收到以下錯誤:
型別定義錯誤:[簡單型別,類 org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor];嵌套例外是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties found to create BeanSerializer(為避免例外,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)(通過參考鏈:java.util.ArrayList[0]->edowl.Model.SubmittedQuiz["user"]->edowl.Model.User$HibernateProxy$lNsgwyQb["hibernateLazyInitializer"])"
該請求很好地找到了物件,在設定斷點時它實際上獲取了物件串列,但是它在 return 陳述句上失敗了。
控制器方法如下圖:
@GetMapping("/getForUser/{id}")
public ResponseEntity<List<SubmittedQuiz>> getSubmittedQuizForUser(@PathVariable("id") Long id){
List<SubmittedQuiz> quizzes = submittedQuizService.findAllByUserId(id);
return new ResponseEntity<>(quizzes, HttpStatus.OK); //ok is 200 status code
}
服務如下圖:
public List<SubmittedQuiz> findAllByUserId(Long id) {
return submittedQuizRepo.findAllByUserId(id);
}
回購如下所示:
List<SubmittedQuiz> findAllByUserId(Long id);
如下圖SubmittedQuiz所示:
@Entity
@Table(name = "Submitted_Quiz")
public class SubmittedQuiz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(name = "User_Quiz_Submitted",
joinColumns = { @JoinColumn(name = "quiz_submitted_id")},
inverseJoinColumns = { @JoinColumn(name = "user_id")})
public User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(name = "Quiz_Quiz_Submitted",
joinColumns = { @JoinColumn(name = "quiz_submitted_id")},
inverseJoinColumns = { @JoinColumn(name = "quiz_id")})
public Quiz quiz;
private float score;
private LocalDate generatedDate;
private float timeTaken;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "quiz_submitted_question",
joinColumns = { @JoinColumn(name = "quiz_submitted_id")},
inverseJoinColumns = { @JoinColumn(name = "question_id")})
@Column(name = "submitted_questions")
private Set<SubmittedQuestion> submittedQuestions = new HashSet<>();
我看到了一個關于在物件上放置@JsonBackReference和@JsonManagedReference 注釋的建議。
但是到目前為止,我不需要在任何其他物件上執行此操作,并且到目前為止我使用的當前注釋已經足夠了
有什么建議嗎?
uj5u.com熱心網友回復:
為此,您可以嘗試使用EntityGraph 。
并設定為atributePaths所有具有FetchType.LAZY:
@EntityGraph(attributePaths = {"user", "quiz", "submitted_questions"})
List<SubmittedQuiz> findAllByUserId(Long id);
控制器的一些提示 - 您不需要200直接設定回應。OK默認回傳狀態碼。所以以下會很好:
@GetMapping("/getForUser/{id}")
public List<SubmittedQuiz> getSubmittedQuizForUser(@PathVariable("id") Long id){
return submittedQuizService.findAllByUserId(id);
}
更新:
嘗試添加 Web 配置,例如::
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public Module datatypeHibernateModule() {
return new Hibernate5Module();
}
}
如果它無助于解決錯誤問題,請嘗試添加:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
對你所有的子物體:
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(...)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public User user;
此外,JPA API 要求您的物體必須是可序列化的。您必須按如下方式更新它:
public class SubmittedQuiz implements Serializable {
private static final long serialVersionUID = 1L;
也為其他物體添加相同的內容(用戶、測驗...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/410649.html
標籤:
