繁体   English   中英

执行其他控制器方法的JPA.withTransaction方法错误:Global.java:39:错误:此处不允许使用“无效”类型

[英]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()返回Callback0Function0<> ,但我不知道该怎么做。

我的方法就是这样做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您应该具有:

  • CrmController-入口点
  • CrmService-实际业务逻辑

这种分离允许在Global类以及Controller层中使用CrmService ,而无需重复逻辑。 注意,这只是一个建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM