2013-11-22 4 views
1

Как я могу создать платеж в jBilling программно из планового плагина? Проблема заключается в том, я хочу создать платеж, не связанный с какой-либо счет-фактуру, поэтому я стараюсь использоватьjBilling: Как создать платеж программно?

applyPayment(PaymentDTOEx payment, Integer invoiceId, Integer executorUserId) 

с InvoiceID = NULL, но это приводит к ошибке:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

Первоначально я попробуйте:

IPaymentSessionBean psb = Context.getBean(Context.Name.PAYMENT_SESSION); 
psb.applyPayment(new PaymentDTOEx(paymentWS), null, userID); 

Позже я добавил "userbl.webServicesAuthenticate (пользователь, пройти)" раньше, но результат тот же.

Я думаю, что я пропустил что-то важное и, возможно, сделал это совершенно неправильно.

+1

Для downvoters: Пожалуйста, подумайте о том, чтобы оставить комментарий, чтобы OP знал, что не так с их вопросом. –

ответ

1

Я никогда не использовал jBilling раньше, но после того, как немного прибегая к помощи похоже, она использует Spring для управления транзакциями и т.д.

От ошибки вы цитируемого это выглядит, как вы не имеете Hibernate сеанс открыт. Если вы использовали веб-фреймворк (например, Spring MVC, например), жизненный цикл сеанса Hibernate обычно управляется для вас прозрачным использованием фильтра сервлетов.

Если вы выполняете платеж с запланированной службы, вам может потребоваться открыть и закрыть сеанс Hibernate самостоятельно в вашей службе. Существует некоторая документация here, которая описывает, как это сделать программно, используя Spring.

Также обратите внимание на аннотацию @Transactional. Это может быть так же просто, как аннотировать ваш запланированный метод работы с этим.

+0

Благодарим вас за то, что указали мне в правильном направлении! Теперь это выглядит очевиден, но позже не ясен для меня, поскольку я пытаюсь найти причину в jBilling, не думая о Spring. – Andrew

+0

Без проблем, рад, что вам удалось его отсортировать :) – rcgeorge23

1

Благодаря rcgeorge23! Проблема в том, что активной сессии Hibernate не было открыто. Вот рабочий код:

IPaymentSessionBean psb = Context.getBean(Context.Name.PAYMENT_SESSION); 

    //transaction manager is available in jBilling like that: 
    PlatformTransactionManager txManager = Context.getBean(Context.Name.TRANSACTION_MANAGER); 

    DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
    def.setName("CreatePaymentTransaction"); 
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //not sure which strategy is best in this case 

    TransactionStatus status = txManager.getTransaction(def); 
    String ret; 

    try { 
     ret =Integer.toString(psb.applyPayment(new PaymentDTOEx(paymentWS), null, userID)); 
    } 
    catch (Exception ex) { 
     txManager.rollback(status); 
     throw ex; 
    } 
    txManager.commit(status); 
0

Вы также можете создать плагин для пользователя.

например, когда пользователь будет создан или добавлен, то сумма по умолчанию должна быть оплачена.

Для этого вам нужно написать плагин, и это произойдет, когда пользователь создаст.

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