2013-06-02 8 views
6

मैं RestEasy, Jboss 7 और EJB 3.1 के साथ काम कर रहा हूं। मैं एक विश्वसनीय वेब सेवा बना रहा हूं जो JSON प्रारूप में डेटा लौटाता है।@JsonIgnore और @JsonBackReference को अनदेखा किया जा रहा है

समस्या यह है कि मेरे पास मेरी इकाइयों में से एक पर @ManyToOne संबंध है जो क्रमिकरण के दौरान अनंत पुनरावृत्ति का कारण बनता है। मैंने समस्या को ठीक करने के लिए जैक्सन के @JsonIgnore और @JsonBackReference एनोटेशन का उपयोग करने की कोशिश की लेकिन ऐसा लगता है कि उन्हें पूरी तरह अनदेखा किया जा रहा है और अनंत पुनरावृत्ति अभी भी हो रही है।

यह मेरा उपयोगकर्ता क्लास है:

@JsonManagedReference("role-User") 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "role") 
public Set<User> getUsers() { 
    return this.users; 
} 

मैंने कहीं पढ़ा है कि मैं अपने आवेदन के साथ जैक्सन पंजीकरण करना होगा उपयोग करने के लिए सक्षम होने के लिए:

class User { 
    private String userId; 
    private Role role; 

    @Id 
    @Column(name = "\"UserId\"", unique = true, nullable = false, length = 30) 
    public String getUserId() { 
     return this.UserId; 
    } 

    public void setUserId(String UserId) { 
     this.UserId = UserId; 
    } 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "\"RoleId\"", nullable = false) 
    //I have tried @JsonIgnore without @JsonBackReference 
    @JsonIgnore 
    //I have tried @JsonBackReference without @JsonIgnore 
    //Also I have tried @JsonBackReference and @JsonIgnore together 
    @JsonBackReference("role-User") 
    public Role getRole() { 
     return this.role; 
    } 
} 

यह मेरी भूमिका कक्षा का एक हिस्सा है नियमित जैक्सबी एनोटेशन इसलिए मैंने कक्षा

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JacksonContextResolver implements ContextResolver<ObjectMapper> { 
    public JacksonContextResolver() { 
     ObjectMapper mapper = new ObjectMapper(); 
     AnnotationIntrospector introspector = new JaxbAnnotationIntrospector(); 

     mapper.getDeserializationConfig().setAnnotationIntrospector(
       introspector); 
     mapper.getSerializationConfig().setAnnotationIntrospector(introspector); 
    } 

    public ObjectMapper getContext(Class<?> objectType) { 
     return objectMapper; 
    } 
} 

उपरोक्त के साथ समस्या 01 हैबहिष्कृत है।

करें: किसी भी विचार क्यों जैक्सन एनोटेशन अनदेखा किया जा रहा

  • आप है?
  • मैं जैक्सन के बजाय नियमित जेएक्सबी एक्सएमएल एनोटेशन का उपयोग कैसे कर सकता हूं?
  • JaxbAnnotationIntrospector() के बजाय मैं क्या उपयोग कर सकता हूं?

इनमें से किसी भी प्रश्न का उत्तर सराहना की है, धन्यवाद।

अद्यतन:

अभी के लिए मैं resteasy-jackson-provider बाहर रखा गया है jboss-deployment-structure.xml का उपयोग कर और मैं बोझ गिराना बजाय उपयोग कर रहा हूँ। मैं अभी भी जानना चाहता हूं कि मैं जैक्सन का उपयोग कैसे कर सकता हूं!

उत्तर

2

देखो, मैं तुम्हें करने के लिए कुछ इसी तरह की है और मेरे लिए ठीक काम कर रहा है ...

@JsonBackReference("promotion-travel") 
@ManyToOne(cascade = CascadeType.ALL) 
    @JoinTable(name="PROMOTION_TRAVEL_REL", 
     joinColumns = @JoinColumn(name="TRAVEL_ID"), 
     inverseJoinColumns = @JoinColumn(name="PROMOTION_ID") 
) 
public Promotion getPromotion(){... 

और यही मैं ENTITY1 पर है

@JsonManagedReference("promotion-travel") 
@OneToMany(mappedBy="promotion") 
public List<Travel> getTravelList(){... 

मैं अगर नहीं जानते है शीर्ष करने के लिए एनोटेशन चलती कुछ भी बदल जाएगा, लेकिन है कि केवल बात यह है कि मैं देख सकता है ...

चीयर्स,

0

यहां समस्या List<User> के बजाय Set<User> का उपयोग करने से संबंधित है। मुझे बिल्कुल वही समस्या थी और Set<User> से List<User> में यह तय किया गया था, अन्यथा मुझे हमेशा जैक्सन से Infinite recursion त्रुटि मिली। मुझे नहीं पता कि यह वास्तव में जैक्सन में एक बग है या आपको Set का उपयोग करते समय कुछ अन्य एनोटेशन आदि प्रदान करना है।

3

मुझे यह समस्या थी और मेरे निर्माण (pom.xml) में जैक्सन लाइब्रेरी के संस्करण को 1.8.x से 1.9.13 तक अपडेट करके काम करने के लिए एक ही कोड मिला। यदि आप मेवेन का उपयोग कर रहे हैं, तो अपने पोम को संपादित करें।एक्सएमएल शामिल करने के लिए:

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

प्रलेखन मदद नहीं करता है, लेकिन ऐसा लगता है कि समूह के लिए वापस संदर्भ 1.8.x संस्करणों में समर्थित नहीं कर रहे थे।

0

मैं वसंत 4.0.1 का उपयोग कर रहा हूँ, हाइबरनेट 4.3.5, जैक्सन 1.9.2 और एसटीएस आईडीई

मैं एक ही अपवाद था, लेकिन @Transient idont द्वारा सेटर व्याख्या द्वारा हल जानते हो क्यों, लेकिन यह ठीक काम करता है

यह मेरा इकाई वर्गों है User.class

//i get that suggestion from some sites 
    @JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) 
    @Entity 
    @Table(name = "user", catalog = "someSchema")  
    public class User implements java.io.Serializable { 

     private String name; 
     private String password; 
     private String username; 
     private Set<Telephone> telephones = new HashSet<Telephone>(0); 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
     public Set<Telephone> getTelephones() { 
      return this.telephones; 
     } 

     public void setTelephones(Set<Telephone> telephones) { 
      this.telephones = telephones; 
     } 
    } 

Telephone.class

@Entity 
@Table(name = "telephone", catalog = "someSchema") 
public class Telephone implements java.io.Serializable { 


    private User user; 
    private String telephone; 

    @ManyToOne(fetch = FetchType.LAZY) 

    @JoinColumn(name = "user_id", nullable = false) 
    public User getUser() { 
     return this.user; 
    } 


    @Transient 
    public void setUser(User user) { 
    this.user = user; 
    } 

} 

अपने आवेदन करने के लिए जैक्सन को पंजीकृत करने के विषय में, मैं xml config

<mvc:annotation-driven> 
     <mvc:message-converters> 
      <bean 
       class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
       <property name="objectMapper"> 
        <bean 
         class="web.jsonConverters.HibernateAwareObjectMapper" /> 
       </property> 
      </bean> 
     </mvc:message-converters> 
    </mvc:annotation-driven> 

और नक्शाकार वर्ग

public class HibernateAwareObjectMapper extends ObjectMapper { 

    public HibernateAwareObjectMapper() { 
     Hibernate4Module hm = new Hibernate4Module(); 
     registerModule(hm); 
    } 
} 
4

उपयोग import org.codehaus.jackson.annotate.JsonBackReference; के बजाय import com.fasterxml.jackson.annotation.JsonBackReference; इस्तेमाल किया।

यह मेरे लिए समस्या थी।

+0

@GeeKh कृपया उपर्युक्त सुझाव का प्रयास करें। – user104309

+0

यह मेरे लिए काम करता है (संघर्ष के कुछ दिनों के बाद)। जैक्सन संस्करण को अपग्रेड करने के बाद यह आवश्यक था। धन्यवाद उपयोगकर्ता 10430 9! –

+0

पकड़े जाने में आसान - जैक्सन 1.9 के खिलाफ निर्माण कर रहा था, लेकिन देव पर्यावरण को पहले ही जैक्सन 2+ में अपग्रेड कर दिया गया है, जो पुराने एनोटेशन के बारे में कुछ भी नहीं जानता है। –

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