Я работаю с электронной коммерцией, и я интегрируюсь с 3 различными платежными шлюзами. Все они требуют callbackurl, чтобы вернуть статус транзакции.Сопоставление ответа JSON на абстрактный тип в сервисе JAVA Сервис
Я определил ресурс для хранения состояния транзакции
http://www.api.com/api/users/{userid}/order/{orderId}/payments/{paymentModeId}/paymentStatus
я определил интерфейс под названием IPaymentStatusResponse и создал 3 реализаций. На основе метода paymentModeId в пути uri будет выбрана соответствующая реализация, чтобы сохранить статус транзакции.
например: обратного вызова URL для трех различных gatewyas будет выглядеть этот режим оплаты 1 - paytm, режим оплаты 2 - PayU, режим оплаты 3- куб.см проспект.
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.me[email protected]1ee3ab21; line: 1, column: 1]
Другой вариант, я буду иметь, чтобы определить различные конечные точки для всех различных шлюзов и карта объекта ответа.
UPDATE:
Хорошее объяснение можно найти здесь http://programmerbruce.blogspot.in/2011/05/deserialize-json-with-jackson-into.html
Он нужен элемент типа в JSON ответ, чтобы выбрать конкретный класс. Пример 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 {
}
Может ли это быть реализованы с некоторым запросом или параметр пути?