簡體   English   中英

將JSON響應映射到JAVA rest Service中的抽象類型

[英]Mapping JSON response to an abstract type in JAVA rest Service

我正在與一家電子商務公司合作,我正在與3個不同的支付網關集成。 所有這些都需要callbackurl來回發交易狀態。

我已經定義了一個資源來存儲事務的狀態

http://www.api.com/api/users/{userid}/order/{orderId}/payments/{paymentModeId}/paymentStatus

我已經定義了一個名為IPaymentStatusResponse的接口,並創建了3個實現。 根據uri路徑中的paymentModeId,將選擇適當的實現來保持事務狀態。

例如:三個不同的gatewyas的回調網址將看起來像這種支付模式1 - paytm,支付模式2 - payu,支付模式3 cc大道。

http://www.api.com/api/users/300/order/501/payments/1/paymentStatus
http://www.api.com/api/users/300/order/501/payments/2/paymentStatus
http://www.api.com/api/users/300/order/501/payments/3/paymentStatus

方法簽名

public void createPaymentStatus(
            @PathParam("paymentModeId") int paymentModeId,
            IPaymentStatusResponse response) throws MyAppException {
        paymentServiceImpl.createPaymentResponse(response, paymentModeId);
}

這是接近這個的正確方法嗎?

當我發布HTTP帖子時,我收到以下錯誤:

Can not construct instance of com.myapp.dto.payments.IPaymentStatusResponse, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@1ee3ab21; line: 1, column: 1]

其他選項,我必須為所有不同的網關定義不同的端點並映射響應對象。

更新:

可以在這里找到一個很好的解釋http://programmerbruce.blogspot.in/2011/05/deserialize-json-with-jackson-into.html

它需要響應json中的一個type元素來選擇具體類。 示例提到json類型和我的界面配置。 這有效。 但不知道如何處理這個因為響應json不在我的控制之下,它來自支付網關提供商

{
  "MID":"abc",
  "TXNID":"T123",
  "ORDERID":"100",
  "BANKTXNID":"B123",
  "TXNAMOUNT":"1",
  "CURRENCY":"INR",
  "STATUS":"TXN_SUCCESS",
  "RESPCODE":"01",
  "RESPMSG":"Txn Success",
  "TXNDATE":"2015-12-14 02:10:29.742447",
  "GATEWAYNAME":"ICICI",
  "BANKNAME":"ICICI",
  "PAYMENTMODE":"CC",
  "type":"PayTMPaymentResponse",  
  "CHECKSUMHASH":"ggg"
}

接口

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @Type(value = PayTMPaymentResponse.class, name = "PayTMPaymentResponse") })
public interface IPaymentStatusResponse {

}

可以使用一些查詢或路徑參數來實現嗎?

Spring / Jackson無法自動反序列化。 您必須為給定類型提供自定義反序列化程序。 我認為為共享信息和3個策略做一個POJO應該更容易。

如果你使用傑克遜,它應該會有所幫助。 我認為其他libs有類似的東西。 http://wiki.fasterxml.com/JacksonPolymorphicDeserialization

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM