Resending as it seems my reply didn't show up... -Sadhana
On 11/7/09 12:17 AM, "Sadhana Jain" <[email protected]> wrote: > Hi Sergey, > Thanks very much again for your quick reply. I was able to get the correct > content-type set by creating the JsonProvider in the code and setting the > media types and using WebClient's create method to register the provider. > > However, I am still not able to get the json parsed and stored in the > Credentials bean correctly. I get this error during parsing (which > unmarshaller should the JosnProvider use to unmarshall json?): > > Nov 7, 2009 12:02:40 AM org.apache.cxf.jaxrs.provider.AbstractJAXBProvider > handleJAXBException > WARNING: javax.xml.bind.UnmarshalException > - with linked exception: > [javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"id"). > Expected elements are <{}>] > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamExceptio > n(UnmarshallerImpl.java:425) > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unmarshal > lerImpl.java:362) > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unmarshall > erImpl.java:332) > at > org.apache.cxf.jaxrs.provider.JSONProvider.readFrom(JSONProvider.java:156) > at > org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:401) > at > org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:544) > at > org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:536) > at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:510) > at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:286) > at org.apache.cxf.jaxrs.client.WebClient.get(WebClient.java:314) > at > gwy.flixster.FlixsterAPITest.getCredentialsTest(FlixsterAPITest.java:67) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.j > ava:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) > at > org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) > at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) > at > org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoa > die.java:87) > at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77) > at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42) > at > org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunne > r.java:88) > at > org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java > :51) > at > org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) > at > org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) > at > org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) > at > org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestRefer > ence.java:46) > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunn > er.java:467) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunn > er.java:683) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.ja > va:390) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.j > ava:197) > Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", > local:"id"). Expected elements are <{}>,<{}tokens.json> > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(Unma > rshallingContext.java:642) > at > com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254) > at > com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249) > at > com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(L > oader.java:116) > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoade > r.childElement(UnmarshallingContext.java:1049) > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(Un > marshallingContext.java:478) > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(Unm > arshallingContext.java:459) > at > com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(Inte > rningXmlVisitor.java:71) > at > com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElemen > t(StAXStreamConnector.java:242) > at > com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStream > Connector.java:176) > at > com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unmarshal > lerImpl.java:360) > ... 31 more > Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", > local:"id"). Expected elements are <{}>] > ... 42 more > > The json response from the service looks like this: > { > "id": 157373130, > "token":"xxxx......." > ........ > } > > In the Credentails class I have: > @XmlRootElement(name="") > public class Credentials > { > private String id; > private String token; > > .... > > Getter/setters defined. > } > > > Any idea why I am getting this exception? Which reader does actually do the > json unmarshalling? > > Thanks much, > Sadhana > > P.S. Thanks for the info on Spring configuration - I tried it but am running > into issues. I will try later after it is working without spring > configuration. I tried InInterceptor to change the content type but didn't > know how I will set it in the Message. I didn't see any methods to set the > values. Can you please give an example? > > > On 11/6/09 3:26 PM, "Sergey Beryozkin" <[email protected]> wrote: > >> Hi >> >> You can update the incoming Content-Type in a couple of ways : >> 1. Configure JSONProvider to accept text/javascript and application/json >> (set consumeTypes on it). >> When registering JSONProvider from Spring you can do the way it's done >> here : >> http://svn.apache.org/repos/asf/cxf/trunk/systests/jaxrs/src/test/resour >> ces/jaxrs/WEB-INF/beans.xml >> >> See the 'jsonProvider' bean. >> >> Or you can configure a JSONProvider from the code and register it using >> one of the WebClient.create() methods >> >> 2. Register a custom CXF input interceptor (as shown below for >> LoggingInInterceptor) and set a Message.ContentType property on the >> message to application/json >> >> >>> Is there a way to specify configuration in Spring? Also how does >>> jaxrs:client configuration in Spring work for WebClient? >> >> jaxrs:client is a proxy based client created from spring and it is meant >> to be injected into a client code. But you can also create and configure >> a WebClient from Spring if needed but it will also have to be injected >> into the code - is it what you'd like to do ? >> For ex, if a jaxrs:client or WebClient bean created from spring has an >> id 'client' then you can have a field (of type WebClient for ex) >> annotated with @Resource("client") and Spring will inject this bean.... >> >> >>> If I want to configure my own MessageBody Json reader for processing >> the >>> json response, how would I do that? >> >> Please see above : either from code or from Spring >> >> Cheers, Sergey >> >> >> -----Original Message----- >> From: Sadhana Jain [mailto:[email protected]] >> Sent: 06 November 2009 18:13 >> To: [email protected] >> Subject: Re: Is it possible to parse json response using JAXRS >> WebClient? >> >> Hi Sergey, >> >> Thank you so much for your quick responses and elaborate replies. >> >> >> On 11/6/09 5:31 AM, "Sergey Beryozkin" <[email protected]> wrote: >> >>> Hi Sadhana >>> >>>> Hi Sergey, >>>> >>>> Here is what I am doing: >>>> WebClient wc = WebClient.create("http://xxx.com/api/v1/tokens.json"); >>>> wc.query("login", "jessicamontgomery"); >>>> wc.query("password", "password"); >>>> Credentials c = >> wc.accept("application/json").get(Credentials.class); >>>> >>>> Credentials class is a pojo that contains all the getter/setters for >> all >>>> keys in the json response I am getting from the service. >>> >>> Is it a JAXB bean ? >> Yes, I did put the XmlRootElement annotation for the class thought the >> element name is null as I don't have a corresponding element in the json >> response. >>> >>>> >>>> The Error I get is: >>>> Nov 6, 2009 2:00:58 AM org.apache.cxf.jaxrs.client.AbstractClient >>>> reportNoMessageHandler >>>> SEVERE: .No message body reader found for class : class >>>> gwy.flixster.pojo.Credentials, ContentType : {1}. >>>> >>> >>> If Credentials is not a JAXB bean then JSONProvider will return false >> in >>> isReadable() >>> Another thing to check what ContentType the target service sets on the >>> response. You can do it with a tcp trace utilty (for ex, >>> assuming the target service is listening on "http://xxx.com:8080" then >> you >>> update the client code to send a request to >>> "http://xxx.com:8081" and configure a tcptrace to redirect to >>> "http://xxx.com:8081"). >> Thanks for the tip. I did find that Content-Type returned was >> text/javascript instead of application/json. I tried text/javascript as >> accept header but still get the same error. >> >>> >>> Another option is to configure a logging feature or logging in >> interceptor : >>> >>> WebClient.getConfig(client).getInInterceptors().add(new >>> LoggingInInterceptor()) >> >> Is there a way to specify configuration in Spring? Also how does >> jaxrs:client configuration in Spring work for WebClient? >> >>> >>>> Do I need to define jsonprovider whe creating the webclient? >>> >>> No, unless you'd like to configure the JSONProvider somehow. For >> example, if >>> Credentials is not annotated with say @XmlRootElement >>> then you can configure JSONProvider with a property >> 'unmarshallAsJaxbElement' >>> with a value 'true'. >>> >> If I want to configure my own MessageBody Json reader for processing the >> json response, how would I do that? >> >> Thanks a lot....again! >> Sadhana >>> thanks, Sergey >>> >>>> >>>> Thanks, >>>> Sadhana >>>> >>>> On 11/6/09 1:37 AM, "Sergey Beryozkin" <[email protected]> wrote: >>>> >>>>> Hi, >>>>> >>>>>> >>>>>> Hi, >>>>>> >>>>>> I am using the JAXRS WebClient API and get a json response from a >> rest >>>>>> service. Does CXF support reading of the json using a message body >> reader >>>>>> that I can attach to the WebClient? Are there any examples of the >> usage of >>>>>> WebClient showing processing of the response? >>>>> >>>>> It should work out of the box....What issues you're seeing in >> reading JSON ? >>>>> Can you please post a sample >>>>> sequence ? >>>>> >>>>> thanks, Sergey >>>>> >>>>>> >>>>>> Thanks very much for any help. >>>>>> Sadhana >>>>>> >>>> >>> >>
