【问题标题】:JPA.withTransaction executing other controllers method error: Global.java:39: error: 'void' type not allowed hereJPA.withTransaction 执行其他控制器方法错误:Global.java:39: error: 'void' type not allowed here
【发布时间】:2014-12-09 19:00:38
【问题描述】:

我正在尝试在某些时间间隔内执行一些数据库插入/更新查询。

为了实现这一点,我决定使用 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&lt;&gt;,但我不知道该怎么做。

我的方法就是做this.persist。为什么我还要从那里返回一些东西?

【问题讨论】:

    标签: java jpa transactions akka actor


    【解决方案1】:

    ImportCrmDatacontroller 因此它必须返回一个有效的 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 文件中映射到这样的 url:

    GET /customers controller.CustomerController.getCustomers
    

    申请以上pattern你应该有:

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

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

    【讨论】:

    • 我已将 ImportCrmData 移至服务中。它不再扩展播放控制器类。错误仍然发生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多