【问题标题】:How to create aspect in Grails 3.3.2 for domain class save method?如何在 Grails 3.3.2 中为域类保存方法创建方面?
【发布时间】:2018-02-06 21:44:41
【问题描述】:

我想在 grails 3.3.2 中创建一个方面,每次调用我的域类对象的 save() 方法时都会执行该方面。

我该怎么做?

/************/

编辑: @pavger

我尝试了以下代码,尽管调用了 ProyectoService 的任何方法,但我的 Aspect 从未运行

服务领域类

import grails.gorm.services.Service

@Service(Proyecto)
interface ProyectoService {

    Proyecto get(Serializable id)

    List<Proyecto> list(Map args)

    Long count()

    void delete(Serializable id)

    Proyecto save(Proyecto proyecto)

}

方面!

@Aspect
class MeAspect {
    @PostConstruct
    public void init() {
        println "Inicializado"
    }

    @Pointcut("within(com.sample.ProyectoService.*())")
    void isDomainClass() {}


    @Around("isDomainClass()")
    Object aroundSaveConnector(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object[] args = proceedingJoinPoint.getArgs()
        println "Aspecto before"
        Object object = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs())
        println "Aspecto after"
        return object
    }
}

【问题讨论】:

  • 您需要发布到目前为止您尝试过的代码。我们无法为您完成所有工作。至少向我们展示一下答案的尝试。
  • @pavger 我添加了更多细节!对不起,我的第一条评论!
  • 您的问题中没有足够的信息。也许您的构建根本不使用 AspectJ 编译器,或者存在其他配置问题。也许您的示例类 ProyectoService 位于错误的包中,而不是 com.sample 中。此外,within() 切入点需要类型模式,而不是方法模式。因此,即使前两个问题得到解决,它也不能像这样工作。如果在您编辑问题后我能识别您的问题,我将很乐意回答。
  • aspectj 库使用的是 compile 'org.springframework:spring-aspects:4.3.12.RELEASE' 这是我拥有的代码,取决于 Poincut 运行与否的配置,问题是我希望它在我的域类对象的 save() 完成时运行

标签: spring grails aspectj aspect


【解决方案1】:

您可以在 Domain 类上创建一个选项。 这是 GORM 上的一个选项

事件和自动时间戳 GORM 支持将事件注册为在某些事件发生时触发的方法,例如删除、插入和更新。以下是支持的事件列表:

beforeInsert - 在对象最初持久保存到数据库之前执行。如果返回false,插入将被取消。

beforeUpdate - 在更新对象之前执行。如果返回false,更新将被取消。

beforeDelete - 在删除对象之前执行。如果返回false,删除将被取消。

beforeValidate - 在验证对象之前执行

afterInsert - 在对象被持久化到数据库后执行

afterUpdate - 在对象更新后执行

afterDelete - 在对象被删除后执行

onLoad - 从数据库加载对象时执行

http://gorm.grails.org/6.0.x/hibernate/manual/

class Person {
   private static final Date NULL_DATE = new Date(0)

   String firstName
   String lastName
   Date signupDate = NULL_DATE

   def beforeInsert() {
      if (signupDate == NULL_DATE) {
         signupDate = new Date()
      }
   }
}



class Person {

   def securityService

   String firstName
   String lastName
   String lastUpdatedBy

   static constraints = {
      lastUpdatedBy nullable: true
   }

   def beforeUpdate() {
      lastUpdatedBy = securityService.currentAuthenticatedUsername()
   }
}

【讨论】:

  • 这很好,但是使用一个方面的想法是让我的所有域类都动态化,怎么可能让我所有的域类都动态化呢?
  • 您可以创建一个超域类,然后他们从这个超域扩展所有域类,然后使用它
  • 之所以这对我无效,是因为我需要能够在数据库中修改之前访问对象的数据以及已经修改的数据。我知道做到这一点的方法要归功于 Aspects。是否有可能以另一种方式做到这一点?
  • 你可以在方法中做任何事情。
  • 您可以访问数据,并从那里调用任何其他内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多