2011-05-24 15 views
6

मैं अपने स्वयं के जेसन संदेशबॉडी रीडर/संदेशबॉडीवाइटर के साथ जर्सी का उपयोग करने की कोशिश कर रहा हूं (क्योंकि मैं अपने डोमेन वर्गों पर @XmlRootElement ... एनोटेशन का उपयोग नहीं कर रहा हूं)।जर्सी को मेरा संदेशबॉडी रीडर नहीं देखा गया है

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public final class MyGsonMessageBodyHandler implements MessageBodyWriter<Object>, MessageBodyReader<Object> { 
... 
} 

जर्सी (के रूप में इसे लागू विधि writeTo में ब्रेकप्वाइंट पर रुक जाता है) messagebodywriter के रूप में इस वर्ग का उपयोग करता है। होवर यह संदेश को संदेशवाहक के रूप में नहीं देखता है (और जब भी मैं इस वर्ग को संदेशसमूह/संदेशवाहक के अलग-अलग कार्यान्वयन में तोड़ देता हूं, तब भी यह मेरे संदेशवाहक का उपयोग करने से इंकार कर देता है)।

final Greeting greeting = resource.path("/greeting") 
      .queryParam("name", name) 
      .accept(MediaType.APPLICATION_JSON) 
      .type(MediaType.APPLICATION_JSON) 
      .get(Greeting.class); 

त्रुटि इस प्रकार मैं दिखता है::

A message body reader for Java class test.Greeting, and Java type class test.Greeting, and MIME media type application/json was not found 

मैं सोच रहा हूँ जादू की किस तरह लेखन के लिए आवश्यक है

परीक्षण कोड के रूप में (जर्सी-ग्रिजली) इस प्रकार लग रहा है अपना संदेश बॉडी रीडर?

उत्तर

0

मुझे यकीन नहीं है कि यह आपका मामला है, लेकिन आम गलती isReadable विधि का गलत कार्यान्वयन है।

क्या आपने इसे लागू किया था?
क्या आप डीबगिंग करते समय वहां रुकते हैं?
क्या यह सच हो जाता है?

9

थोड़ी देर बाद मुझे इस मुद्दे का मूल कारण मिला। MessageBodyReader/लेखक के मेरे कार्यान्वयन ठीक है (और मैं इसे RESTlet साथ ठीक काम करता है), लेकिन अगर आप JerseyTest उपयोग करें, अपने MessageBodyReader/लेखक जोड़ने के लिए यह ClientConfig है न भूलें:

/** 
* Creates custom REST client config which is mandatory since we don't use any JSON providers. 
* @return Jersey Client Config with the required classes to read/write in(out)coming data. 
*/ 
private static ClientConfig createClientConfig() { 
    final ClientConfig config = new DefaultClientConfig(); 
    config.getClasses().add(GsonMessageBodyHandler.class); 
    config.getClasses().add(GsonAwareContextResolver.class); 
    return config; 
} 

/** 
* Public ctor 
* @throws com.sun.jersey.test.framework.spi.container.TestContainerException On error 
*/ 
public MyRestExposureTest() throws TestContainerException { 
    super(new WebAppDescriptor.Builder("my.rest.package") 
      .clientConfig(createClientConfig()) 
      .contextPath("/") 
      .build()); 
} 

अन्यथा अपने ग्राहक कोड आपके पीओजेओ पढ़ने/लिखने में असमर्थ होगा।

+0

मैं जर्सी 1.17 उपयोग कर रहा हूँ और यह मेरे लिए काम नहीं करता। क्लाइंट कॉन्फ़िगरेशन का मूल्यांकन कभी नहीं किया जाता है। – Raffael

3

यही वह है जो मैं उपयोग कर रहा हूं और यह काम कर रहा है (वर्तमान में जर्सी 1.8 के साथ)।

public static Client createMyClient() { 
    ClientConfig cc = new DefaultClientConfig(); 
    cc.getClasses().add(MyProviderClass1.class); 
    cc.getClasses().add(MyProviderClass2.class); 
    cc.getClasses().add(MyProviderClass3.class); 
    return Client.create(cc); 
} 
0

एलेक्स 'समाधान की कोशिश कर के बाद, इस अंत में मेरे लिए काम किया:

public IntegrationTest() throws TestContainerException { 
    super(new LowLevelAppDescriptor.Builder(createResourceConfig()) 
        .build()); 
} 

private static ResourceConfig createResourceConfig() { 
    ResourceConfig rc = new PackagesResourceConfig("com.github.joschi.jersey.security.smime"); 
    rc.getSingletons().add(new EnvelopedWriter()); 
    rc.getSingletons().add(new SignedWriter()); 
    return rc; 
} 
संबंधित मुद्दे