2012-06-07 13 views
5

के साथ जेएसओएन प्रतिक्रिया मार्शल कर रहा है मुझे JSONConfiguration.FEATURE_POJO_MAPPING के साथ जर्सी क्लाइंट (1.11) का उपयोग करके कुछ समस्याएं आ रही हैं। मेरे परीक्षण कोड इस तरह दिखता है:जेएक्स-आरएस जर्सी क्लाइंट पीओजेओ मैपिंग और जैक्सन

MyFooCollectionWrapper<MyFooDTO> resp 
    = webResource.accept(MediaType.APPLICATION_JSON) 
     .get(new GenericType<MyFooCollectionWrapper<MyFooDTO>>() {}); 

सर्वर पर:

1) मेरी web.xml POJO मानचित्रण सही पर सेट किया है।

2) MyFooDTO बस एक POJO कि इस तरह दिखता है है:

public class MyFooDTO { 

private long id; 
private String propA; 

pubic long getId() { 
    return id; 
} 
public void setId(long id) { 
    this.id = id; 
} 

pubic String getPropA() { 
    return propA; 
} 
public void setPropA(String propA) { 
    this.propA = propA; 
} 

public MyFooDTO(MyFoo aFoo) { 
    this.id = aFoo.getId(); 
    this.propA = aFoo.getPropA(); 
} 

    public MyFooDTO() {} 

} 

3) MyFooCollectionWrapper इस तरह दिखता है:

public class MyFooCollectionWrapper<T> extends MyFooCollectionWrapperBase { 

    Collection<T> aCollection; 

    public MyFooCollectionWrapper() { 
     super(); 
    } 

    public MyFooCollectionWrapper(boolean isOK, String msg, Collection<T> col) { 
     super(isOK, msg); 
     this.aCollection = col; 
    } 

    public void setCollection(Collection<T> collection) { 
     this.aCollection = collection; 
    } 

    @JsonProperty("values") 
    public Collection<T> getCollection() { 
     return aCollection; 
    } 
} 

public class MyFooCollectionWrapperBase { 

    private boolean isOK; 
    private String message; 

    public MyFooCollectionWrapperBase() { 
     this.message = ""; 
     this.isOK = false; 
    } 

    public MyFooCollectionWrapperBase(boolean ok, String msg) { 
     this.isOK = ok; 
     this.message = msg; 
    } 

    .. standard getter/setters .. 

} 

मैं सत्यापित करने के बाद सर्वर Json प्रतिक्रिया बनाने में कोई समस्या नहीं है। यदि मैं प्रतिक्रिया प्रकार को स्ट्रिंग पर सेट करता हूं तो मैं अपने जर्सी क्लाइंट कोड से पुनर्प्राप्त कर सकता हूं। जब मैं

MyFooCollectionWrapper<MyFooDTO> resp = webResource.accept(MediaType.APPLICATION_JSON).get(new GenericType<MyFooCollectionWrapper<MyFooDTO>>() {}); 

का उपयोग मैं POJO मानचित्रण सिर्फ एक कस्टम संदेश शरीर पाठक के लिए किसी भी आवश्यकता के बिना (मार्शल प्रतिक्रिया) काम करने की उम्मीद होगी। हालांकि, मैं मिलता है:

Jun 04, 2012 3:02:20 PM com.sun.jersey.api.client.ClientResponse getEntity 
SEVERE: A message body reader for Java class com.foo.MyFooCollectionWrapper, and Java type  com.foo. MyFooCollectionWrapper<com.foo.MyFooDTO>, and MIME media type application/json was not found 
Jun 04, 2012 3:02:20 PM com.sun.jersey.api.client.ClientResponse getEntity 
SEVERE: The registered message body readers compatible with the MIME media type are: 
application/json -> 
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App 
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App 
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App 
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App 
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App 
*/* -> 
com.sun.jersey.core.impl.provider.entity.FormProvider 
com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider 
com.sun.jersey.core.impl.provider.entity.StringProvider 
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
com.sun.jersey.core.impl.provider.entity.FileProvider 
com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General 
com.sun.jersey.core.impl.provider.entity.ReaderProvider 
com.sun.jersey.core.impl.provider.entity.DocumentProvider 
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader 
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader 
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader 
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General 
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General 
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General 
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General 
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General 
com.sun.jersey.core.impl.provider.entity.EntityHolderReader 
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General 
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General 
com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy 
com.sun.jersey.moxy.MoxyMessageBodyWorker 
com.sun.jersey.moxy.MoxyListMessageBodyWorker 


com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class com.foo.MyFooCollectionWrapper, and Java type com.foo. MyFooCollectionWrapper<com.foo. MyFooDTO>, and MIME media type application/json was not found 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:550) 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:524) 
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:686) 
    at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:74) 
    at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:508) 

ग्राहक के पक्ष परीक्षण पर वर्ग पथ में शामिल हैं:

jersey-test-framework-core-1.11.jar 
jersey-test-framework-embedded-glassfish-1.11.jar 
jersey-test-framework-grizzly-1.11.jar 
jersey-test-framework-http-1.11.jar 
jersey-test-framework-inmemory-1.11.jar 
jackson-core-asl.jar 
jackson-jaxrs.jar 
jackson-xc.jar 
jackson-client.jar 
jersey-client.jar 
jersey-core.jar 
jersey-json.jar 
jettison.jar 

मेरी उम्मीदों गलत कर रहे हैं या मैं यहाँ कुछ स्पष्ट याद आ रही है?

एक साइड नोट के रूप में, यदि मैं अपनी संस्थाओं (@XmlRootElement MyFooCollectionWrapper और MyFooDTO पर) को जोड़ता हूं, तो उसी वेब रिसोर्स को कॉल करने के लिए, क्लाइंट मुझे संदेश बॉडी रीडर अपवाद नहीं मिलता है, हालांकि, प्रतिक्रिया है मार्शल जैसे कि MyFooCollectionWrapper ठीक दिखता है लेकिन इसके संग्रह में MyFooDTO नहीं है जिसमें इसमें नोड्स/अटर्स में उचित मान वाले एक्सएमएल दस्तावेज़ शामिल हैं - दूसरे शब्दों में MyFooDTP को मार्शल नहीं किया जाता है।

जब java.util.logging को CONFIG में सेट किया गया था, जैसा कि उत्तर में सुझाया गया था, मैं निम्नलिखित को देखता हूं, हालांकि कुछ भी मेरे लिए कूदता नहीं है। आउटपुट में link है जो मैंने लंबाई के कारण पेस्टबिन पर रखा है। -

धन्यवाद,

-नूह

अद्यतन

मूल रूप से मेरे मुवक्किल और ग्राहक config इसलिए की तरह बनाया जा रहा था हल:

Client rootClient = new Client(); 
ClientConfig clientConfig = new DefaultClientConfig(); 
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); 
Client client = new Client(rootClient, clientConfig); 

जब मैं इस बस को

बदल
ClientConfig clientConfig = new DefaultClientConfig(); 
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); 
    Client client = Client.create(clientConfig); 

चीजें काम किया। ऐसा लगता है कि रूट क्लाइंट क्लाइंट को ओवरराइड कर रहा था क्लाइंट कॉन्फिग नए क्लाइंट पर। यह अजीब लगता है कि जब आप एक कन्स्ट्रक्टर का उपयोग करते हैं जो क्लाइंट कॉन्फिग निर्दिष्ट करता है तो क्लाइंटकॉन्फिग रूट क्लिंट्स कॉन्फ़िगर द्वारा ओवरराइड हो जाता है।

+0

क्या आप अपना JSON भी दिखा सकते हैं? – tomfumb

उत्तर

6

क्लाइंट की तरफ POJO मानचित्रण सक्षम करने के लिए, बस कार्य करें:

ClientConfig clientConfig = new DefaultClientConfig(); 
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); 
Client client = Client.create(clientConfig); 
+0

मैं पहले से ही ऐसा कर रहा हूं। ऊपर दिए गए मेरे प्रश्न की पहली वाक्य यही है, "मुझे जर्सी क्लाइंट (1.11) का उपयोग करके JSONConfiguration.FEATURE_POJO_MAPPING सत्य पर सेट किया गया है" का जिक्र है। – NBW

+0

यह सटीक दृष्टिकोण काम करता है। क्या गलत था के विवरण के लिए उपरोक्त मेरी संशोधित टिप्पणियां देखें। – NBW

+1

अच्छा जवाब। जर्सीटेस्ट को कॉन्फ़िगर करते समय यह आवश्यक है, अन्यथा केवल जर्सीटेस्ट का सर्वर हिस्सा पीओजेओ के साथ काम करेगा और क्लाइंट आपकी टेस्ट क्लास में विफल हो जाएगा: https://java.net/projects/jersey/lists/users/archive/2011- 07/संदेश/43 – pulkitsinghal

0

मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि MyFooDTO नो आर्ग निर्माता नहीं है।

यदि आप java.util.logging स्तर को CONFIG तक बदलते हैं, तो आपको ऐसी कई समस्याओं को निदान करने में सहायता करने वाले कई अतिरिक्त संदेश देखना चाहिए।

+0

मेरे कोड में वास्तव में कोई तर्क निर्माता नहीं है, मैं इसे उपरोक्त नमूने से बाहर छोड़ दूंगा हालांकि मैंने इसे जोड़ा है। तो भले ही इसमें कोई तर्क नहीं है, फिर भी मुझे यह समस्या है। – NBW

+0

मैंने CONFIG आउटपुट जोड़ा। इस मुद्दे के रूप में कुछ भी नहीं निकलता है। – NBW

0

क्या आप जानते हैं कि मुझे क्या आसान लगता है?

MyFooDTO[] resp = webResource.accept(MediaType.APPLICATION_JSON).get(MyFooDTO[].class); 

एक सरणी प्रकार का उपयोग करके मार्शलर जानता है कि आप किस प्रकार को खींचना चाहते हैं और जानते हैं कि यह एक संग्रह है। आपको लीजिट संग्रह की सभी कार्यक्षमता नहीं मिलती है, लेकिन आप इसे तुरंत पुन: सक्रिय कर सकते हैं और इसे स्ट्रीम कर सकते हैं।

0

आप क्लाइंट की तरफ POJO मानचित्रण के रूप में मामले में नीचे

  ClientConfig clientConfig = new DefaultClientConfig(); 
      clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); 
      Client client = Client.create(clientConfig); 

      WebResource webResource = client 
        .resource("http://localhost:8080/api/url"); 

      ClientResponse response = webResource.accept("application/json") 
        .get(ClientResponse.class); 

      if (response.getStatus() != 200) { 
       throw new RuntimeException("Failed : HTTP error code : " 
         + response.getStatus()); 
      } 

      POJOObject output = response.getEntity(POJOObject.class); 

दिखाए आप तो आप इस

  List<POJOObject> pojoList = webResource.get(new GenericType<List<POJOObject>>() { }); 

आप इन निर्भरताओं उपयोग करने की आवश्यकता कर सकते हैं जवाब में वस्तुओं की सूची है सक्षम कर सकते हैं

<dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-client</artifactId> 
     <version>1.18.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-json</artifactId> 
     <version>1.18.1</version> 
    </dependency> 
संबंधित मुद्दे