[英]JPA.withTransaction executing other controllers method error: Global.java:39: error: 'void' type not allowed here
我试图在某些时间间隔执行一些数据库插入/更新查询。
为此,我决定使用Akka Actor系统中内置的Playframework。
我上课有方法:
public class Global extends GlobalSettings {
@Override
public void onStart(Application application) {
Akka.system().scheduler().schedule(
Duration.create(1, TimeUnit.SECONDS), // start task delay
Duration.create(24, TimeUnit.HOURS), // between task instance delay
//Duration.create(24, TimeUnit.HOURS), // between task instance delay
new Runnable() {
@Override
public void run() {
JPA.withTransaction(
ImportCrmData.start()
);
}
},
Akka.system().dispatcher()
);
以及actor系统调用的方法:
public class ImportCrmData extends Controller {
@Transactional
public static void start() {
List<Customer> customersToUpdate = CustomerCRM.importCrmData();
for(Customer c: customersToUpdate) {
c.toDataBase();
}
}
}
我在编译时遇到错误:
[error] app/modules/common/app/Global.java:39: error: 'void' type not allowed here ImportCrmData.start()
我知道发生此问题是因为JPA.withTransaction()要求我从ImportCrmData.start()
返回Callback0
或Function0<>
,但我不知道该怎么做。
我的方法就是这样做this.persist
。 我为什么还要从中退回一些东西?
ImportCrmData
是一个控制器,因此它必须返回有效的http响应(结果)。 典型的用例:
public class CustomerController extends Controller {
public static Result getCustomers() {
List<Customer> customers = CustomerService.getCustomers();
return ok(Json.toJson(customers));
}
}
上面的示例由控制器组成,该控制器是您应用程序的入口点,并响应客户端请求。 CustomerService
封装了与获取客户有关的逻辑。 ok(...)
返回Result
的实现-一个有效的http响应,代码为200,在上述情况下为json主体。 它在Controller
基类中实现。 接下来,您的控制器可以在routes
文件中映射到如下网址:
GET /customers controller.CustomerController.getCustomers
应用以上pattern
您应该具有:
这种分离允许在Global
类以及Controller
层中使用CrmService
,而无需重复逻辑。 注意,这只是一个建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.