2017-06-23 1 views
1

Forum Antwort sparen Zeit mit Issue.before ich erfolgreich mit @JsonIgnore gespeichert, aber jetzt habe ich entfernt @JsonIgnore annonation.and hat @JsonBackReference und @JsonManagedReference hinzugefügt.Kann verwaltete/zurück Referenz 'defaultReference' nicht behandeln: zurück Referenztyp (java.util.List) nicht kompatibel mit verwalteten Typ (ForumAnswerReplay)

Stack Trace

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; 
} 

Controller-Code:

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; 
} 

Antwort

3

Ich glaube, Sie @JsonManagedReference und @JsonBackReference verlegt haben.

@JsonManagedReference: der vordere Teil der Referenz, so dass er auf den Sammlertyp angewendet wird.

@JsonBackReference: seinen hinteren Teil der Referenz.

so muss Ihr Code sein wie

@JsonManagedReference 
    private List<ForumAnswerReplay> forumAnswerReplayList; 

@JsonBackReference 
    private ForumAnswer forumAnswer; 

Sie auch @JsonIdentityInfo Sie können

@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

danke für Ihre Wiederholung. In Eigenschaftenebene anstelle von @JsonManagedReference verwende ich @JsonIdentityInfo (generator = ObjectIdGenerators.PropertyGenerator.class, property = "forumAnswerId"), aber nicht funktioniert. gleiches Problem, dem ich gegenüberstehe. – umapathi

+0

@umapati: Sie müssen '@ JsonManagedReference' und' @ JsonBackReference' entfernen und '@ JsonIdentityInfo' für beide Klassen hinzufügen. –

+0

Ich habe beide Annotationen entfernt und die Klasse @JsonIdentityInfo hinzugefügt. Jetzt werden Daten erfolgreich gespeichert, aber es werden Zeitdaten abgerufen, die nicht zu ui reichen. – umapathi

2

Entfernen @JsonManagedReference in ForumAnswer Klasse anzuwenden.

ForumAnswer Klasse:

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

In ForumAnswerReplay:

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

danke jetzt arbeiten – umapathi

0

Verwenden @JsonBackReference für @OneToMany und @JsonManagedReference für @ManyToOne Beziehung zu ermöglichen Jackson besser die Beziehung zu behandeln.

Verwandte Themen