【问题标题】:Customize save() method in Spring Roo在 Spring Roo 中自定义 save() 方法
【发布时间】:2012-01-05 14:13:28
【问题描述】:

我已经用 Spring Roo 做了一个应用程序(我还是个新手),我想在实体被持久化后做一些处理。我已经使用 Service 和 DAO 层设置了应用程序。在服务中,我创建了一个名为 triggerChange(MyEntity myEntity) 的自定义方法。我希望在保存实体后调用此方法,但我不知道如何在不修改由 Roo 管理的 *ServiceImpl_Roo_Service (不应编辑)的情况下调用该方法。

所以我有这样的代码:

服务:

public class MyEntityServiceImpl implements MyEntityService {
    //this is the method I want to invoke inside or after invoking save()
    public void triggerChange(MyEntity myEntity) {
        ...
    }
}

服务方面:

privileged aspect MyEntityServiceImpl_Roo_Service {
    ...
    public void MyEntityServiceImpl.saveMyEntity(MyEntity myEntity) {
        myEntityRepository.save(myEntity);
    }

}

如何自定义保存方式?

谢谢

【问题讨论】:

    标签: java spring spring-mvc aspectj spring-roo


    【解决方案1】:

    一种方法是使用 JPA 或 Hibernate 事件。

    看看这个blog(作者是一个非常活跃的 SO 用户),它解释了 Spring Beans 如何用于此类事件。

    【讨论】:

    • 谢谢,好主意,但我想要更通用的方法,因为此方法不能用于自定义 Spring Roo 创建的查找器
    • @Javi:发现者?你的问题是关于储蓄的!无论如何,也有加载事件。
    【解决方案2】:

    感谢 Roo,您在 Spring 应用程序中启用了 AspectJ。只需创建一个方面(在方法调用之后或周围)

    您也可以从 Roo 方面 (.aj) 移动方法

    在 STS 中,从方面类中选择所需的方法(甚至属性),右键单击,重构-> 推入...并直接按 Review-OK 或 OK(我推荐前者以查看更改)

    另一种方式:在 Roo 运行的情况下,只需在类中创建一个具有相同签名的方法/属性。 Roo 将从方面删除等价物。

    【讨论】:

      【解决方案3】:

      我只需要在保存方法之后执行一些业务逻辑,就像你想要的那样。

      假设我必须记录已执行的保存操作。为此,我创建了这个方面:

      package com.malsolo.aspects;
      
      import org.apache.log4j.Logger;
      import com.malsolo.myproject.domain.MyEntity;
      
      aspect MyEntityAspect {
      
          private final Logger logger = Logger.getLogger(MyEntityAspect.class);
      
          pointcut persistEntity() : execution(* MyEntity.persist(..));
      
          public Logger getLogger() {
              return logger;
          }
      
          after() : persistEntity() {
              logger().info("Entity persisted "+thisJoinPoint);
          }
      
      }
      

      它写道:

      2011-11-30 11:47:27,056 [主要] 信息 com.malsolo.aspects.ModifyRolAspect - 实体持久执行(无效 com.malsolo.myproject.domain.MyEntity.persist())

      希望对你有帮助。

      注意事项:

      • 我正在使用带有@Entity 方法的 Roo 1.1.5,我没有服务层
      • 注意Entity的导入。它行不通 没有它。
      • 如果您将 STS 与 AJDT 结合使用,您将看到已应用的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多