[英]JPA and JSON serialization problems
幫助解決問題。 我有2個實體類:
1。
@Entity
@Table(name = "topic")
public class Topic {
@Id
@Column(name = "topic_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "system_id")
private int systemId;
@Column(name = "topic_name")
private String name;
@OneToMany(mappedBy = "topic", fetch = FetchType.EAGER, orphanRemoval = true)
private List<Faq> faqList;
// getters and setters
@Override
public String toString() {
return "Topic{" +
"id=" + id +
", systemId=" + systemId +
", name='" + name + '\'' +
", faqList=" + faqList +
'}';
}
}
2。
@Entity
@Table(name = "faq")
public class Faq {
@Id
@Column(name = "faq_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "question")
private String question;
@Column(name = "answer")
private String answer;
@ManyToOne
@JoinColumn(name = "topic_id")
@JsonIgnore
private Topic topic;
//getters and setters
@Override
public String toString() {
return "Faq{" +
"id=" + id +
", question='" + question + '\'' +
", answer='" + answer + '\'' +
", topicId=" + topic.getId() +
'}';
}
}
我被迫在toString方法中僅向控制台寫入topic.id,因為出現錯誤“ StackOverflow”。 序列化到JSON(傑克遜轉換器)的情況類似,因此我使用了@JsonIgnore批注。 一切都還好。 但是有一個問題:當我從controller.js {topic: {id: "1"}, question: "test", answer: "test"}
發送JSON對象{topic: {id: "1"}, question: "test", answer: "test"}
到服務器時
@RequestMapping(method = RequestMethod.POST, value = "/faqs")
@ResponseBody
public Message editFaq(@RequestBody Faq faq) {
System.out.println(faq);
Message message = new Message("ok");
return message;
}
在System.out中,我得到了NullPointerException。 我認為這是因為@JsonIgnore,當我嘗試獲取faq.toString(topic.getId())時出現異常。 我怎么解決這個問題?
我解決了這個問題,將路徑變量添加到帖子中:
@RequestMapping(method = RequestMethod.POST, value = "/faqs/{topicId}")
...
Topic topic = new Topic();
topic.setId(topicId);
faq.setTopic(topic);
但這是秒殺。
StackOverflow錯誤是由於Topic和Faq之間的循環依賴關系。 最好避免這些。
我還將避免在數據庫和HTTP組件(例如REST或SOAP端點)中使用同一類。 對數據庫類的更改將立即反映在客戶端和服務器之間的數據結構中;對於SOAP,由於接口已更改,因此很可能導致客戶端損壞。 而是在您的REST或SOAP組件中編寫一個類似的探測類( FaqVersion1
, TopicVersion1
), TopicVersion1
鏡像數據庫的字段,但僅鏡像您要公開的那些字段。 在方法( editFaq
) editFaq
此類作為參數接受,並將內容映射到數據庫類( Faq
)的實例。 這樣可以將數據庫代碼與外部接口(Web)完全分開。
結果,表示Faq
Web界面類( FaqVersion1
)可能具有一個名為topicId
的字段,該字段是對其所屬的Topic
的簡單String
或int
引用。 然后,您的應用程序可以負責接受FaqVersion1
,發現topicId
並在內部創建指向實際Topic
的Faq
。
聽起來很簡單,不是嗎? 實際上,這是在您將數據庫隱藏在主應用程序后面並確保Web組件獨立之后。 這種分離對於您的應用程序的健康發展非常有利。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.