2016-02-11 4 views
6

मुझे इस पर संसाधनों के ओडल्स मिल गए हैं, जैसे कि यह एक - Infinite Recursion with Jackson JSON and Hibernate JPA issue। मेरे पास ने को वर्णित सभी विभिन्न सुझावों को लागू करने के लिए प्रयास किया है (मूल @ जेसन इग्नोर सहित), लेकिन इसका कोई फायदा नहीं हुआ। मैं जो कोशिश करता हूं उसके बावजूद मैं अनंत रिकर्सन त्रुटियों के अलावा कुछ भी नहीं प्राप्त कर सकता हूं। मुझे लगता है कि मेरे पास एक बहुत ही समान/विशिष्ट सेटअप है, लेकिन जाहिर है कि @JsonManagedReference, @JsonBackReferencere और @JsonIdentityInfo एनोटेशन का उपयोग करने के बावजूद कुछ गलत है, मुझे त्रुटि मिल रही है।जैक्सन जेएसओएन और हाइबरनेट जेपीए मुद्दे के साथ अनंत रिकर्सन (अभी तक एक और)

मेरी टेबल "एक्सचेंज" और "स्टॉक" हैं, जिनमें से कई के बीच कई हैं, और मैं ExchangeEndpoint के माध्यम से परीक्षण कर रहा हूं। मैंने पुष्टि की है कि अगर मैं पूरी तरह से "एक्सचेंज" इकाई से "स्टॉक" को हटा देता हूं, तो सेवा ठीक काम करती है, लेकिन किसी कारण से, जेसन एनोटेशन का कोई असर नहीं पड़ता है। नीचे मैं सोचता हूं उपरोक्त Infinite Recursion with Jackson JSON and Hibernate JPA issue में दूसरे (लेकिन अधिक लोकप्रिय) उत्तर पर आधारित समाधान है।

Exchange.java

@Entity 
@Table(name = "exchange", schema = "public") 
@XmlRootElement 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class Exchange implements java.io.Serializable { 
... 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "exchange") 
    @JsonManagedReference 
    public Set<Stock> getStocks() { 
     return this.stocks; 
    } 
... 

Stock.java

@Entity 
@Table(name = "stock", schema = "public") 
@XmlRootElement 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class Stock implements java.io.Serializable { 
... 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "exchangeid", nullable = false) 
    @JsonBackReference 
    @JsonIgnore 
    public Exchange getExchange() { 
     return this.exchange; 
    } 
... 

ExchangeEndpoint.java

@Stateless 
@Path("/exchanges") 
public class ExchangeEndpoint { 
    @PersistenceContext(unitName = "postgresql-ss4") 
    private EntityManager em; 
... 
    @GET 
    @Produces("application/json") 
    public List<Exchange> listAll(@QueryParam("start") Integer startPosition, 
      @QueryParam("max") Integer maxResult) { 
     TypedQuery<Exchange> findAllQuery = em 
       .createQuery(
         "SELECT DISTINCT e " 
         + "FROM Exchange e " 
         + "LEFT JOIN FETCH e.stocks " 
         + "ORDER BY e.exchangeid", 
         Exchange.class); 
     if (startPosition != null) { 
      findAllQuery.setFirstResult(startPosition); 
     } 
     if (maxResult != null) { 
      findAllQuery.setMaxResults(maxResult); 
     } 
     final List<Exchange> results = findAllQuery.getResultList(); 
     return results; 
    } 

संपादित करें:

त्रुटि उत्पादन का यकीन है कि मैं 'होने के लिए मैं misinterpretin नहीं है जी कुछ;

15: 35: 16,406 त्रुटि [org.jboss.resteasy.resteasy_jaxrs.i18n] (http-/0.0.0.0: 8080-1) RESTEASY000100: org.jboss: /आदान-प्रदान/प्राप्त क्रियान्वित करने में विफल रहा। resteasy.spi.WriterException: org.codehaus.jackson.map.JsonMappingException: अनंत रिकर्सन (स्टैक ओवरव्लो एरर) (संदर्भ श्रृंखला के माध्यम से: net.hb.forge2RestServices.model.Exchange ["स्टॉक"] -> org.hibernate.collection .internal.PersistentSet [0] -> net.hb.forge2RestServices.model.Stock ["exchange"] -> net.hb.forge2RestServices.model.Exchange ["स्टॉक"] -> org.hibe ... । .. एक्सचेंज ["स्टॉक"] -> org.hibernate.collection.internal.P ersistentSet [0] -> net.hb.forge2RestServices.model.Stock ["exchange"] -> net.hb.forge2RestServices.model.Exchange ["स्टॉक"]) org.jboss.resteasy.core.ServerResponse.writeTo पर (ServerResponse.java2362)

कृपया मुझे बताएं कि मैं अपनी हार को समझाने में सहायता के लिए कौन सी अतिरिक्त जानकारी प्रदान कर सकता हूं। tiy।

उत्तर

0

समस्या यह है कि आपके पास Stock एस का संदर्भ है और Stock से आपके पास Exchange का संदर्भ है। इसलिए JSON स्टॉक पर जाता है, Exchange पर और फिर Exchange के लिए यह सभी Stock एस और इसी तरह के लिए उत्पन्न होगा।

चक्र को तोड़ने के लिए JsonIgnore उस क्षेत्र में एनोटेशन डालना सर्वोत्तम है जो मूल वस्तु का संदर्भ देता है - ManyToOne - इस मामले में यह स्टॉक.एक्सचेंज फ़ील्ड (या उसके लिए गेटर) है।

+0

मैं अलग अलग तरीकों की एक जोड़ी में JsonIgnore एनोटेशन जोड़ने की कोशिश की, लेकिन यह अभी भी नहीं लगता है कुछ भी की तरह अलग ढंग से व्यवहार कर रहा है। मैंने उन लोगों में से एक के साथ मूल प्रश्न अपडेट किया, जहां मैंने इसे अभी तक संभाला, लेकिन मैंने जेसनबैक रेफरेंस को बदलने की कोशिश की और एनोटेशन को क्षेत्र परिभाषा (गेटटर के बजाए) में स्थानांतरित करने की कोशिश की, लेकिन मुझे एक ही परिणाम मिलते हैं। क्या कोई तरीका है कि इन टिप्पणियों को अस्वीकार कर दिया जा सकता है? – swv

2

यदि आप आरईएसटी के माध्यम से अपनी जेपीए इकाइयों का पर्दाफाश नहीं करते हैं तो इस तरह के मुद्दों को अधिक आसानी से टाला जाता है।

आपको आरटीटी पक्ष पर डीटीओ और डीटीओ को मैपिंग इकाइयों का उपयोग करने पर विचार करना चाहिए और मैन्युअल रूप से मैपर कोडिंग करके या MapStruct का उपयोग करके एक उत्पन्न करके विचार करना चाहिए।

बोनस के रूप में आप सुरक्षा समस्याओं से बचेंगे।

+0

मानचित्र संरचना दिलचस्प लगती है। मैं उम्मीद कर रहा हूं कि इस परियोजना को इस तरह की एक और परत जोड़ने के लिए वास्तव में परिष्कृत नहीं किया जाएगा, लेकिन मैं कई अन्य परियोजनाओं की कल्पना कर सकता हूं। संदर्भ के लिए धन्यवाद। – swv

1

ऐसा लगता है कि समस्या आयात के साथ थी। मुझे यकीन नहीं है क्यों, लेकिन org.codehaus.jackson.annotate.JsonIgnore मेरे लिए काम करता है, और com.fasterxml.jackson.annotation.JsonIgnore नहीं करता है।

1

@JsonManagedReference का प्रयोग करें, @JsonBackReference

public class User { 
    public int id; 
    public String name; 

    @JsonBackReference 
    public List<Item> userItems; 
} 


public class Item { 
    public int id; 
    public String itemName; 

    @JsonManagedReference 
    public User owner; 
} 

ध्यान दें कि:

@JsonManagedReference संदर्भ के आगे हिस्सा है - एक है कि सामान्य रूप से धारावाहिक रूप हो जाता है। @ जेसनबैक रेफरेंस संदर्भ का पिछला हिस्सा है - इसे क्रमबद्धरण से छोड़ा जाएगा।

http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

संबंधित मुद्दे