2013-07-05 53 views
0

預先感謝您提供有關CXF REST提供者面臨的以下問題的建議。在REST web服務中與內容類型「application/x-www-form-urlencoded」爭鬥

我使用Apache CXF開發了REST Web服務服務器。以下是合同定義。請注意,這在Camel環境中使用。

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定義:

<cxf:rsServer id="rsServer" address="/{{publicAddress}}" serviceClass="a.b.cPaymentSandboxService" 
     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" /> 

當我送與內容類型的請求 '應用/ JSON的' 一切工作正常。但是當一個請求與Content-Type'application/x-www-form-urlencoded'一起發送時,請求會觸發服務器,但在將主體轉換爲所需的數據類型時會失敗。以下是我在Fuse esb日誌中獲得的日誌的一部分。日誌的

部分:

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]} 
-------------------------------------- 
+0

請訪問以下鏈接註釋AmountTransaction性能。來自cxf-user組的Sergey向我提供了一個解決方案。 [解決方法:謝爾蓋](http://cxf.547215.n5.nabble.com/Consume-quot-application-x-www-form-urlencoded-quot-Content-Type-in​​-REST-Web-Service- CXF-rsServer-td5730399.html#a5730446) – Dilunika

回答

1

的soution(塞吉) http://cxf.547215.n5.nabble.com/Consume-quot-application-x-www-form-urlencoded-quot-Content-Type-in-REST-Web-Service-cxf-rsServer-td5730399.html#a5730446

不同的解決方案的副本有:

  • 有一個表格或MultivaluedMap參數,而不是AmountTransaction和手動填充AmountTransaction
  • 有一個自定義提供程序(與您一樣建議)
  • 利用CXF擴展@FormParam( 「」)與AmountTransaction
  • 使用JAX-RS 2.0 @BeanParam並與FormParam