在Spring Roo中自定义save()方法

时间:2011-11-24 11:49:35

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

我已经使用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);
    }

}

我如何自定义保存方法?

由于

3 个答案:

答案 0 :(得分:4)

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

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

  

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

     

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

答案 1 :(得分:3)

执行此操作的一种方法是使用JPA或Hibernate事件。

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

答案 2 :(得分:0)

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

我们要说我必须记录已执行保存操作。为此,我创造了这个方面:

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 [主要] INFO   com.malsolo.aspects.ModifyRolAspect - 实体持久执行(无效   com.malsolo.myproject.domain.MyEntity.persist())

我希望它可以帮到你。

注意:

  • 我使用Roo 1.1.5和@Entity方法,我没有服务层
  • 注意实体的导入。它不会起作用 没有它。
  • 如果您将STS与AJDT一起使用,您将看到应用的建议。