如何以预定插件的编程方式在jBilling中创建付款?问题是我想创建一个没有链接到任何发票的付款,所以我尝试使用
applyPayment(PaymentDTOEx payment, Integer invoiceId, Integer executorUserId)
使用invoiceId = null,但会导致错误:
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
最初我尝试:
IPaymentSessionBean psb = Context.getBean(Context.Name.PAYMENT_SESSION);
psb.applyPayment(new PaymentDTOEx(paymentWS), null, userID);
之后我之前添加了“userbl.webServicesAuthenticate(user,pass)”,但结果是一样的。
我认为我错过了一些重要的事情,也许完全错了。
答案 0 :(得分:1)
我之前从未使用过jBilling,但经过一些谷歌搜索后,似乎它使用Spring来管理交易等。
根据您引用的错误,您似乎没有打开Hibernate会话。如果您使用的是Web框架(例如Spring MVC),则通常使用servlet过滤器透明地管理Hibernate会话生命周期。
如果您从预定的服务执行付款,则可能需要在服务中自行打开和关闭Hibernate会话。有一些文档here描述了如何使用Spring以编程方式执行此操作。
另请查看@Transactional
注释。这可能就像使用此注释您的预定作业方法一样简单。
答案 1 :(得分: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);
答案 2 :(得分:0)
您还可以为用户创建插件。
例如,当用户创建或添加时,应支付默认金额。
因为你必须编写一个插件,它将在创建用户时出现。