2015-12-14 3 views
3

Я работаю с электронной коммерцией, и я интегрируюсь с 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 { 

} 

Может ли это быть реализованы с некоторым запросом или параметр пути?

ответ

0

Spring/Jackson не может автоматически десериализоваться. Вам необходимо предоставить пользовательский десериализатор для заданного типа. Я думаю, что было бы проще сделать одно POJO для общей информации и трех стратегий.

он должен помочь в случае, если вы используете джексон. Я думаю, что у других libs есть что-то похожее. http://wiki.fasterxml.com/JacksonPolymorphicDeserialization

 Смежные вопросы

  • Нет связанных вопросов^_^