2012-10-18 34 views
6

के लिए स्ट्रिंग देता है मैं सर्वर घटक के लिए वेब सेवा बनाने के लिए जर्सी का उपयोग कर रहा हूं। दुर्भाग्यवश मुझे अपने JSON प्रतिक्रिया के प्रारूपण में कोई समस्या है, क्योंकि डेटा हमेशा स्ट्रिंग के रूप में स्वरूपित होता है।जर्सी में जेएसओएन सीरियलाइजेशन के लिए जेएक्सबी एनोटेटेड पीओजेओ प्रत्येक फ़ील्ड प्रकार

मैं विभिन्न फ़ील्ड के साथ एक सरल JAXB एनोटेट POJO है:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class JaxbPojo { 

    @XmlElement(name = "id_64") 
    private Long id; 

    @XmlElement(name = "desc") 
    private String description; 

    private Boolean active; 

    // getters and setters 
    .. 
} 

और आ सरल संसाधन, आने वाली वस्तु लौटने:

@Path("/jaxb_pojo") 
public class JaxbPojoResource { 

    @POST 
    @Consumes({ MediaType.APPLICATION_JSON }) 
    @Produces({ MediaType.APPLICATION_JSON }) 
    public JaxbPojo processBidRequest(JaxbPojo pojo) { 
     return pojo; 
    } 

} 

जब निम्नलिखित के साथ संसाधन के लिए एक अनुरोध भेजने JSON डेटा, ऑब्जेक्ट संसाधन विधि के अंदर सही ढंग से भर जाता है।

[email protected]:/tmp $ cat simple_jaxb_pojo 
{"id_64":99,"desc":"simple JAXB POJO","active":true} 

[email protected]:/tmp $ curl -X POST -H "Content-Type: application/json" --data-binary @simple_jaxb_pojo http://localhost/srvr/rest/jaxb_pojo 
{"id_64":"99","desc":"simple JAXB POJO","active":"true"} 

सभी इस्तेमाल किया जार फ़ाइलें (jsr311-api-1.1.1.jar, जर्सी कोर-1.6.jar, जर्सी-json-1.6: लेकिन लौटे JSON डेटा के क्षेत्र प्रकार हमेशा स्ट्रिंग के रूप में स्वरूपित हैं .jar, जर्सी-सर्वर-1.6.jar) सीधे टोमकैट/lib पथ में शामिल हैं। JAX-आरएस पुस्तकालय "प्रदान" गुंजाइश के साथ Maven pom.xml के माध्यम से किया जाता है:

<dependency> 
    <groupId>javax.ws.rs</groupId> 
    <artifactId>jsr311-api</artifactId> 
    <version>1.1.1</version> 
    <scope>provided</scope> 
</dependency> 

मेरे web.xml इस तरह दिखता है:

<servlet> 
    <servlet-name>RestServlet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.rest.RestResourcesApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

.. 

<servlet-mapping> 
    <servlet-name>RestServlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

मैं कुछ याद आ रही हूँ या मैं शायद करने के लिए क्या जैक्सन को स्पष्ट रूप से इस तरह से कॉन्फ़िगर करें कि यह मेरे POJO के प्रकारों का उपयोग कर रहा है। मैं इस विषय के लिए बिल्कुल नया हूं, इसलिए मैंने इस पर हर जानकारी पोस्ट की है। मुझे आशा है कि कोई मदद कर सकता है।

उत्तर

1

दिलचस्प समस्या। मुझे यकीन है कि वास्तव में क्यों यह हो रहा है नहीं कर रहा हूँ, लेकिन जोड़ने का प्रयास करें: web.xml में

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
अपने जर्सी सर्वलेट परिभाषा को

। मैंने सोचा कि जर्सी को जेएसओएन का उत्पादन करने की आवश्यकता है, लेकिन जब मैंने इस init-param को हटा दिया तो मैंने वही समस्या देखी जो आपके पास है।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन इसे जोड़ा गया मुझे निम्नलिखित अपवाद मिलता है: सेव: जावा क्लास के लिए एक संदेश बॉडी रीडर .. जैक्सबोजोजो, और जावा टाइप क्लास .. जैक्सबोजोजो, और एमआईएम मीडिया टाइप एप्लिकेशन/जेसन नहीं मिला 18.10.2012 18:56:43 कॉम .sun.jersey.spi.container।ContainerRequest getEntity गंभीर: पंजीकृत संदेश के मुख्य भाग पाठकों माइम मीडिया प्रकार के साथ संगत कर रहे हैं: आवेदन/json -> com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider $ अनुप्रयोग com.sun.jersey.json .impl.provider.entity.JSONRootElementProvider $ ऐप com.sun.jersey.json.impl.provider.entity.JSONListElementProvider $ – henne83

+0

क्या आप निश्चित हैं कि 'जर्सी-जेसन' निर्भरता आपके क्लासपाथ पर है (और यह सही ढंग से स्कॉप्ड है आपका पीओएम)? मैंने अपने पीओएम से इसे हटाने की कोशिश की और आपको वही अपवाद मिला जो आपने किया था। – condit

+0

मजेदार बात यह काम करती है, जब मैं को जर्सी निर्भरताओं के लिए pom.xml के अंदर प्रदान करता हूं। दायरा क्षेत्र सेट होने के बाद, यह ऊपर अपवाद फेंकता है। – henne83

1

उपयोगकर्ता 463324 का समाधान अच्छा है। आम तौर पर, आप अपने जावा ऑब्जेक्ट्स को JSON और वापस कनवर्ट करने के लिए इस समाधान का उपयोग कर सकते हैं। यह जैक्सन पुस्तकालय पर आधारित है।

यदि आप जेएक्सबी पर आधारित जेएसओएन प्राप्त करना चाहते हैं, तो कुछ कॉन्फ़िगरेशन विकल्प उपलब्ध कराए गए हैं, ताकि आप नियंत्रित कर सकें कि चीजें कैसे क्रमबद्ध हो जाती हैं और पीछे हट जाती हैं। डिफ़ॉल्ट कॉन्फ़िगरेशन के लिए, आपको स्ट्रिंग प्रारूप मिलेगा, जैसे आपके प्रश्न की ओर इशारा किया गया है।

अधिक महत्वपूर्ण JSON स्वरूप परिवर्तन प्राप्त करने के लिए, आपको जर्सी JSON प्रोसेसर को स्वयं कॉन्फ़िगर करने की आवश्यकता होगी। JSON कॉन्फ़िगरेशन उदाहरण पर विभिन्न कॉन्फ़िगरेशन विकल्प सेट किए जा सकते हैं। उदाहरण के बाद एक JSONConfigurated JSONJAXBContext बनाने के लिए उपयोग किया जा सकता है, जो इस क्षेत्र में मुख्य कॉन्फ़िगरेशन बिंदु के रूप में कार्य करता है। जर्सी करने के लिए अपने विशेष JSONJAXBContext पास करने के लिए है, तो आप अंत में एक JAXBContext ContextResolver लागू करने के लिए की आवश्यकता होगी:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 

    private final JAXBContext context; 
    private final Set<Class> types; 
    private Class[] ctypes = { JaxbPojo.class}; 
    public JAXBContextResolver() throws Exception { 
     this.types = new HashSet(Arrays.asList(ctypes)); 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), 
       ctypes); 
    } 

    @Override 
    public JAXBContext getContext(Class<?> objectType) { 
     return (types.contains(objectType)) ? context : null; 
    } 
} 

आप विस्तृत जानकारी के लिए jersey' official document देख सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। मैं अब के लिए उपयोगकर्ता 463324 के दृष्टिकोण के साथ रहना होगा। – henne83

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

  • कोई संबंधित समस्या नहीं^_^