簡體   English   中英

JPA和JSON序列化問題

[英]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組件中編寫一個類似的探測類( FaqVersion1TopicVersion1 ), TopicVersion1鏡像數據庫的字段,但僅鏡像您要公開的那些字段。 在方法( editFaqeditFaq此類作為參數接受,並將內容映射到數據庫類( Faq )的實例。 這樣可以將數據庫代碼與外部接口(Web)完全分開。

結果,表示Faq Web界面類( FaqVersion1 )可能具有一個名為topicId的字段,該字段是對其所屬的Topic的簡單Stringint引用。 然后,您的應用程序可以負責接受FaqVersion1 ,發現topicId並在內部創建指向實際TopicFaq

聽起來很簡單,不是嗎? 實際上,這是在您將數據庫隱藏在主應用程序后面並確保Web組件獨立之后。 這種分離對於您的應用程序的健康發展非常有利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM