Hi
Looks like you post a JSON sequence, but use a form media type, and the
form provider expects a sequence of name/value pairs.
I guess what you need is still use the JSON provider to read this
payload. Assuming you can not change the content type at the client side
(it's a form, etc), then you can try:
- add a _ctype query parameter to a request uri, example: /?_ctype=json
- if on CXF 2.7.x - add pre-match ContainerRequestFilter and update a
content type there, otherwise register a CXF interceptor and do
'message.put(Message.CONTENT_TYPE, ""application/json)'
Sergey
On 08/07/13 09:16, dilunika wrote:
Please provide your kind advice to get me solve following problem
My REST web service services have to provide the support for the
content-type "application/x-www-form-urlencoded". So, I have developed my
service as follows.
Contract Definition :
--------------------------
public class PaymentSandboxService {
@POST
@Consumes({"application/json", "application/x-www-form-urlencoded"})
@Produces({"application/json", "application/x-www-form-urlencoded"})
@Path("/2_1/payment/{endUserId}/transactions/amount")
public Response charge(@Body
final AmountTransaction amountTransaction, @PathParam("endUserId")
final String endUserId) throws IOException {
return null;
}
}
Bean Definitions :
-----------------------
<cxf:rsServer id="rsServer" address="/{{publicAddress}}"
serviceClass="org.jkd.lrn.PaymentSandboxService"
loggingFeatureEnabled="true">
<cxf:providers>
<ref bean="jsonProvider" />
<ref bean="formUrlEncodeProvider" />
</cxf:providers>
</cxf:rsServer>
<bean id="jsonProvider"
class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="marshallAsJaxbElement" value="true" />
</bean>
<bean id="formUrlEncodeProvider"
class="org.apache.cxf.jaxrs.provider.FormEncodingProvider" />
When I send a request with Content-Type 'application/json' everything works
fine. But when a request is sent with the Content-Type
'application/x-www-form-urlencoded', request hits the server but it failed
while converting body to the data type AmountTransaction. Following is a
part of log I am getting in fuse.log.
ID: 17
Address:
http://cnb69:8181/cxf/paymentsandbox/2_1/payment/tel:+916309700000/transactions/amount
Encoding: ISO-8859-1
Http-Method: POST
Content-Type: application/x-www-form-urlencoded
Headers: {Accept=[application/json], accept-encoding=[gzip,deflate],
Authorization=[Basic a2FzdW5wYXlzYW5kYm94OnBANTV3MHJk],
connection=[keep-alive], Content-Length=[670],
content-type=[application/x-www-form-urlencoded], Host=[cnb69:8181],
User-Agent=[Apache-HttpClient/4.1.1 (java 1.5)]}
Payload: {
"amountTransaction": {
"clientCorrelator": "54321",
"endUserId": "tel:+916309700000",
"paymentAmount": {
"chargingInformation": {
"amount": "10.2662",
"currency": "USD",
"description": [
"Alien Invaders Game"
]
},
"chargingMetaData": {
"onBehalfOf": "Example Games Inc",
"purchaseCategoryCode": "Game",
"channel": "SMS",
"taxAmount": "0"
}
},
"referenceCode": "REF-12345",
"transactionOperationStatus": "CHARGED"
}
}
--------------------------------------
2013-07-05 13:44:27,477 | WARN | qtp1316166688-257 |
org.apache.cxf.jaxrs.utils.JAXRSUtils | No message body reader has been
found for request class AmountTransaction, ContentType :
application/x-www-form-urlencoded.
2013-07-05 13:44:27,478 | INFO | qtp1316166688-257 |
org.apache.cxf.interceptor.AbstractLoggingInterceptor | Outbound Message
---------------------------
ID: 17
Response-Code: 415
Content-Type: text/xml
Headers: {Date=[Fri, 05 Jul 2013 08:14:27 GMT], Content-Length=[0]}
--------------------------------------
What have I done wrong? Is
"org.apache.cxf.jaxrs.provider.FormEncodingProvider" not the correct
provider for this case? If so, what is the correct way of implementation?
Thanks,
Kasun
--
View this message in context:
http://cxf.547215.n5.nabble.com/Consume-application-x-www-form-urlencoded-Content-Type-in-REST-Web-Service-cxf-rsServer-tp5730399.html
Sent from the cxf-user mailing list archive at Nabble.com.
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com