The JAX-RS : Client API Unable to Handle Response Content Type "text/plain". 
Throws ClientWebApplicationException When Client Service Method is Invoked
-------------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: CXF-4075
                 URL: https://issues.apache.org/jira/browse/CXF-4075
             Project: CXF
          Issue Type: Bug
          Components: JAX-RS
    Affects Versions: 2.5
         Environment: OS: Windows XP
JDK Version: 6


            Reporter: Nathan Gulley
            Priority: Critical
             Fix For: Invalid


The JAX-RS : Client API is unable to handle response content type "text/plain". 
The proxy client throws a ClientWebApplicationException
when the service call is made:

org.apache.cxf.jaxrs.client.ClientWebApplicationException: .No message body 
reader has been found for class : class 
com.sears.forgotpassword.ForgotPassword, ContentType : text/plain.
        at 
org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:593)
        at 
org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:445)
        at 
org.apache.cxf.jaxrs.client.ClientProxyImpl.handleResponse(ClientProxyImpl.java:527)
        at 
org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:487)
        at 
org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:188)
        at $Proxy16.forgotPassword(Unknown Source)
        at 
com.sears.mobilegateway.test.SHCAPIProfileServiceTest.testForgotPassword(SHCAPIProfileServiceTest.java:231)

WEB SERVICE URL: 
http://webservices.sears.com/shcapi/ForgotPassword?store=Sears&appID=MOB_IPH_SEARS_2GO&authID=mrktplcC91F7F1DE2CE3F675A65C172B944C37301202010&langId=-1&catalogId=12605&[email protected]

RESPONSE CONTENT TYPE: text/plain

RESPONSE CONTENT:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
       <ForgotPassword>
           <StatusData>
               <ResponseCode>0</ResponseCode>
               <RespMessage><![CDATA[Action is successful.Please check your 
email account for instructions on how to choose your new 
password.]]></RespMessage>   
           </StatusData> 
           <ServiceHeaders>        
               <Store>        10153        </Store>        
               <LangId>        -1        </LangId>        
               <clientSessionKey>        3uDXyoc2vtZi35gk3UVdyOC        
</clientSessionKey>
           </ServiceHeaders>
       </ForgotPassword>

Here are the detailed steps you need to follow in order to reproduce the bug:

1.  Define a REST client service class that points to a RESTful web service 
that returns content type "text/plain"

CLASS:  import javax.ws.rs.GET;
        import javax.ws.rs.POST;
        import javax.ws.rs.Path;
        import javax.ws.rs.QueryParam;

        import com.sears.forgotpassword.ForgotPassword;        

        public interface SHCAPIProfileService {

          @Path("/shcapi/ForgotPassword") @GET 
          public ForgotPassword forgotPassword(@QueryParam("email") String 
email,
                                               @QueryParam("appID") String 
appID, 
                                               @QueryParam("authID") String 
authID, 
                                               @QueryParam("store") String 
store,
                                               @QueryParam("catalogId") String 
catalogId,
                                               @QueryParam("langId") String 
langId);
        }


2. Add the service class to your Spring configuration file as a CXF JAX-RS 
client bean. Configure the bean to accept content type  
   "text/plain":

<jaxrs:client id="shcapiProfileService" 
address="https://webservices.sears.com:"; 
serviceClass="com.sears.mobilegateway.service.SHCAPIProfileService" 
inheritHeaders="true">
        <jaxrs:headers>
            <entry key="Accept" value="text/plain"/>
            <entry key="Accept" value="text/xml"/>                  
        </jaxrs:headers>
</jaxrs:client>


3. Use a Spring ApplicationContext to reference an instance of the client 
service bean in your code:
 
   ApplicationContext applicationContext = new 
ClassPathXmlApplicationContext("spring-business-context.xml"); 
   SHCAPIProfileService shcapiProfileService = 
(SHCAPIProfileService)applicationContext.getBean("shcapiProfileService");


4. Call the "forgotPassword" service method on the service class:

   ForgotPassword responseObj = shcapiProfileService.forgotPassword(LOGIN_ID, 
APP_ID, AUTH_ID, STORE, CATALOG_ID, LANG_ID);     
        

5. The following ClientWebApplicationException is thrown when JAXB tries to 
unmarshall the response content into the "ForgotPassword" Java object:

org.apache.cxf.jaxrs.client.ClientWebApplicationException: .No message body 
reader has been found for class : class 
com.sears.forgotpassword.ForgotPassword, ContentType : text/plain.
        at 
org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:593)
        at 
org.apache.cxf.jaxrs.client.AbstractClient.readBody(AbstractClient.java:445)
        at 
org.apache.cxf.jaxrs.client.ClientProxyImpl.handleResponse(ClientProxyImpl.java:527)
        at 
org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:487)
        at 
org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:188)
        at $Proxy16.forgotPassword(Unknown Source)
        at 
com.sears.mobilegateway.test.SHCAPIProfileServiceTest.testForgotPassword(SHCAPIProfileServiceTest.java:231)
        
NOTE: This exception should not occur since we configured the service class to 
accept content type "text/plain" in step 2.

      I tried work arounds such as customizing the proxy by running the 
following code before making the client service call:

      WebClient.client(shcapiProfileService).accept("text/plain");

      However these had no effect. The same error occurs.
    


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to