[
https://issues.apache.org/jira/browse/CXF-4075?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Nathan Gulley updated CXF-4075:
-------------------------------
Description:
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=xxxxxxxxxx&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.
was:
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.
> 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=xxxxxxxxxx&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