2012-09-07 13 views
6

मैं सामान्य @Path, @GET, @Produces({"application/json, "application/xml"}) का उपयोग कर एक आरईएसटी webservice बनाने के लिए जेएक्स आरएस का उपयोग कर रहा हूं।जेएक्स आरएस - जेएसओएन और एक्सएमएल परिपत्र/चक्रीय संदर्भ त्रुटि

मैं पीओजेओ को प्रतिक्रिया के रूप में लौटा रहा हूं जो अनुरोध के प्रकार के आधार पर JSON या XML के रूप में भेजा जाता है। यह ठीक काम कर रहा था जब तक कि मैंने को कई अन्य लोगों के साथ संबंध जोड़ा। रिश्ते बिडरेक्शनल है।

मैं जेबॉस एएस 7 का उपयोग कर रहा हूं। मैंने जैक्सन के @JsonManagedReference और @JsonBackReference को जोड़ा लेकिन इसका कोई फायदा नहीं हुआ।

इस पर कैसे प्राप्त करें?

मैं इस तरह मेरी JAX रुपये तैनात: -

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0"> 
    <servlet> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>javax.ws.rs.core.Application</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app>  

मैं किसी भी आवेदन वर्ग का विस्तार या किसी JAXRS उत्प्रेरक वर्ग के लिए इस्तेमाल नहीं किया था।

यह जेबॉस की रीस्टेसी जैक्सन का उपयोग उनके JSON प्रदाता के रूप में कर रही है, फिर भी यह @JsonManagedReference एनोटेशन क्यों नहीं पहचान रहा है?

क्या मुझे निर्भरताओं को अद्यतन करना है, यदि हां तो कैसे? और एक्सएमएल का अनुरोध ठीक करने के तरीके को कैसे ठीक किया जाए, वहां भी यह जेएक्सबी में परिपत्र संदर्भ में विफल रहता है।

अग्रिम धन्यवाद!

+1

क्या आपने यह प्रश्न देखा है? http://stackoverflow.com/questions/3073364/jaxb-mapping-cyclic-references-to-xml – Tomalak

+0

धन्यवाद, मैं इसे देख रहा हूं, लेकिन यह अभी भी जेएसओएन को खुले में छोड़ देता है, नहीं? – Stuarty

+1

मुझे लगता है कि JSON के लिए एक समान दृष्टिकोण होना चाहिए। (हालांकि, मुझे नहीं पता। सवाल उचित रूप से समान लग रहा था इसलिए मैं उन्हें पार करना चाहता था।) – Tomalak

उत्तर

4

नोट: मैं EclipseLink JAXB (MOXy) लीड और JAXB (JSR-222) विशेषज्ञ समूह का सदस्य हूं।

MOXY@XmlInverseReference विस्तार है कि दोनों XML और JSON बंधन में द्विदिश रिश्तों का समर्थन करने के लिए इस्तेमाल किया जा सकता है प्रदान करता है।


जावा मॉडल

ग्राहक

CustomerPhoneNumber वस्तुओं का संग्रह है।

package forum12312395; 

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Customer { 

    private List<PhoneNumber> phoneNumbers; 

    @XmlElement(name="phone-number") 
    public List<PhoneNumber> getPhoneNumbers() { 
     return phoneNumbers; 
    } 

    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) { 
     this.phoneNumbers = phoneNumbers; 
    } 

} 

PhoneNumber

प्रत्येक PhoneNumber वस्तु Customer ऑब्जेक्ट में एक वापस सूचक बनाए रखता है। इस संपत्ति को @XmlInverseReference के साथ एनोटेट किया गया है।

package forum12312395; 

import javax.xml.bind.annotation.XmlValue; 
import org.eclipse.persistence.oxm.annotations.XmlInverseReference; 

public class PhoneNumber { 

    private String value; 
    private Customer customer; 

    @XmlValue 
    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    @XmlInverseReference(mappedBy="phoneNumbers") 
    public Customer getCustomer() { 
     return customer; 
    } 

    public void setCustomer(Customer customer) { 
     this.customer = customer; 
    } 

} 

JAXB।गुण

अपने JAXB प्रदाता के रूप में MOXY उपयोग करने के लिए आप एक फ़ाइल में निम्न प्रविष्टि के साथ अपने डोमेन मॉडल के रूप में एक ही पैकेज में jaxb.properties बुलाया शामिल करने की जरूरत है (देखें: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

INPUT

नीचे दिए गए दस्तावेज हैं कि हम इस उदाहरण में अनारशल करेंगे

input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <phone-number>555-WORK</phone-number> 
    <phone-number>555-HOME</phone-number> 
</customer> 

input.json

{ 
    "customer" : { 
     "phone-number" : ["555-HOME", "555-WORK"] 
    } 
} 

डेमो

package forum12312395; 

import javax.xml.bind.*; 
import javax.xml.transform.stream.StreamSource; 
import org.eclipse.persistence.jaxb.UnmarshallerProperties; 
import org.eclipse.persistence.oxm.MediaType; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Customer.class); 

     // JSON 
     Unmarshaller jsonUnmarshaller = jc.createUnmarshaller(); 
     jsonUnmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); 
     StreamSource json = new StreamSource("src/forum12312395/input.json"); 
     Customer customerFromJSON = (Customer) jsonUnmarshaller.unmarshal(json); 
     for(PhoneNumber phoneNumber : customerFromJSON.getPhoneNumbers()) { 
      System.out.println(phoneNumber.getCustomer()); 
     } 

     // XML 
     Unmarshaller xmlUnmarshaller = jc.createUnmarshaller(); 
     StreamSource xml = new StreamSource("src/forum12312395/input.xml"); 
     Customer customerFromXML = (Customer) xmlUnmarshaller.unmarshal(xml); 
     for(PhoneNumber phoneNumber : customerFromXML.getPhoneNumbers()) { 
      System.out.println(phoneNumber.getCustomer()); 
     } 
    } 

} 

आउटपुट

नीचे डेमो कोड को चलने से उत्पादन होता है। जैसा कि आप देख सकते हैं customer संपत्ति PhoneNumber ऑब्जेक्ट्स पर आबादी है।

[email protected] 
[email protected] 
[email protected] 
[email protected] 

अधिक जानकारी के लिए

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