2017-06-23 52 views
1

論壇答案節省時間面臨issue.before我成功保存使用@JsonIgnore,但現在我刪除@JsonIgnore annonation.and添加@JsonBackReference和@JsonManagedReference。無法處理託管/返回引用'defaultReference':返回引用類型(java.util.List)與託管類型不兼容(ForumAnswerReplay)

堆棧跟蹤

java.lang.IllegalArgumentException: Can not handle managed/back reference 'defaultReference': back reference type (java.util.List) not compatible with managed type (com.tta.abcd.model.ForumAnswerReplay) 
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase._resolveManagedReferenceProperty(BeanDeserializerBase.java:790) 
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:516) 
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:296) 
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) 
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) 
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:443) 
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:196) 
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:26) 
at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:681) 
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:445) 
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:967) 

Forum.java

@Entity 
    @Table(name="Forum") 
    public class Forum { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="forumId") 
    private Long forumId; 

    @Column(name="question") 
    private String question; 

    @Column(columnDefinition="varchar(1000)",name="discription") 
    private String discription; 

    @Column(name="postedDate") 
    private Date postedDate; 

    @Fetch(value = FetchMode.SELECT) 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name = "forumId") 
    @JsonIgnore 
    private List<ForumAnswer> forumList; 
    } 

ForumAnswer.java

@Entity 
    @Table(name="ForumAnswer") 
    public class ForumAnswer { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="forumAnswerId") 
    private Long forumAnswerId; 

    @ManyToOne 
     @JoinColumn(name = "forumId",insertable=true, updatable=true,nullable=true) 
    private Forum forum; 

    @Column(name="answer") 
    private String answer; 

    @Column(name="answerDate") 
    private Date answerDate; 

    @Fetch(value = FetchMode.SELECT) 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name = "forumAnswerId") 
    @JsonBackReference 
    private List<ForumAnswerReplay> forumAnswerReplayList; 

    @Transient 
    private List<ForumAnswerReplay> faqReplayList; 
} 

ForumAnswerReplay.java

@Entity 
@Table(name="ForumAnswerReplay") 
public class ForumAnswerReplay { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="replayId") 
    private Long replayId; 

    @Column(name="replayToAnswer") 
    private String replayToAnswer; 

    @Column(name="replayToAnswerDate") 
    private Date replayToAnswerDate; 


    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="forumAnswerId",insertable=true,updatable=true,nullable=true) 
     @JsonManagedReference 
    private ForumAnswer forumAnswer; 

    @Transient 
    private String message; 
} 

控制器代碼:

public ForumAnswer saveForumAns(@RequestBody ForumAnswer forumAns, BindingResult bindingResult, HttpSession session, 
     HttpServletRequest request, HttpServletResponse response) { 
    ForumAnswer forumDetails = forumService.saveForumAns(forumAns, bindingResult, session); 
    if (forumDetails != null) { 
     forumDetails.setMessage("success"); 
    } 
    else { 
     forumDetails.setMessage("failed"); 
    } 
    return forumDetails; 
} 

DAO:

public ForumAnswer saveForumAns(ForumAnswer forumAns, BindingResult bindingResult) { 

    final Session session = getSession(); 
    try { 
     session.beginTransaction(); 
     Query query = session.createQuery("UPDATE ForumAnswer set answer =:answer," 
       + "forumAnswerId =:forumAnswerId,farmerUuid =:farmerUuid, answerDate =:answerDate"); 
     query.setParameter("answer", forumAns.getAnswer()); 
     query.setParameter("forumAnswerId", forumAns.getForumAnswerId()); 
     query.setParameter("farmerUuid", forumAns.getFarmer()); 
     query.setParameter("answerDate", forumAns.getAnswerDate()); 
     session.merge(forumAns); 
     session.getTransaction().commit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("error while saving forum details" + e); 
    } finally { 
     session.close(); 
    } 

    return forumAns; 
} 

回答

3

我想你遺失@JsonManagedReference和@JsonBackReference。

@JsonManagedReference:它的前向引用部分,所以它將應用於集合類型。

@JsonBackReference:它的後面部分參考。

使你的代碼必須像

@JsonManagedReference 
    private List<ForumAnswerReplay> forumAnswerReplayList; 

@JsonBackReference 
    private ForumAnswer forumAnswer; 

你也可以使用@JsonIdentityInfo你在ForumAnswer類應用

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, 
        property = "forumAnswerId", 
        scope  = Long.class) 
public class ForumAnswer { 
} 

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, 
        property = "replyId", 
        scope  = Long.class) 
public class ForumAnswerReplay { 
} 
+0

感謝您的回覆。在屬性級別而不是@JsonManagedReference我使用@JsonIdentityInfo(發電機= ObjectIdGenerators.PropertyGenerator.class, property =「forumAnswerId」)但沒有working.same問題我面臨。 – umapathi

+0

@umapati:你必須刪除'@ JsonManagedReference'和'@ JsonBackReference',並在這兩個類中添加'@ JsonIdentityInfo'。 –

+0

我刪除了這兩個註釋,並添加了@JsonIdentityInfo類的級別。現在數據正在成功保存,但檢索時間數據未達到ui。 – umapathi

2

刪除@JsonManagedReference。

ForumAnswer類:

@Fetch(value = FetchMode.SELECT) 
    @OneToMany(cascade = CascadeType.ALL,fetch=FetchType.EAGER) 
    @JoinColumn(name = "forumAnswerId") 
    private List<ForumAnswerReplay> forumAnswerReplayList; 

ForumAnswerReplay:

@JsonBackReference 
public ForumAnswer getForumAnswer() { 
    return forumAnswer; 
} 
+0

謝謝你現在的工作 – umapathi

0

使用@JsonBackReference爲@OneToMany和@JsonManagedReference爲@ManyToOne關係,讓傑克遜以更好地處理關係。