Настроить Pointcut для методов Spring JPA-репозитория - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь создать Aspect, который запускается после каждого вызова save () Spring JpaRepository. Я определил свой аспект следующим образом:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class ProcessAspect {

    @Autowired
    private ProcessService processService;

    @AfterReturning(value = "execution(* com.domain.control.repository.ProcessDao.save())))",
    returning = "result")
    private void propagateProcess(JoinPoint joinPoint, Object result) {
        log.info("Aspect is working, congratulations. Jointpoint {} , result {}", joinPoint, result.toString());
        Process process = (process) result;

       // do something on the object returned by save()
        processService.createOrUpdateProcess(process);
    }

}

Мой репозиторий определен следующим образом:

@Repository
public interface ProcessDao extends JpaRepository<Process, String>

Если я настрою его таким образом, то аспект не будет работать.

Как я могу настроить свой аспект для работы после общих методов репозитория JPA?

1 Ответ

2 голосов
/ 15 октября 2019

Во-первых, у вашего ProcessDao нет метода save, поэтому он не будет совпадать, во-вторых, у вас есть pointcut с методом без аргументов save, и такого нет. Вместо этого вы хотите использовать один из классов репозитория Spring Data в вашем pointcut и соответствовать 1 аргументу.

Примерно так:

execution(* org.springframework.data.jpa.repository.JpaRepository+.save(..))))

или чтобы сделать его более универсальным

execution(* org.springframework.data.repository.CrudRepository+.save(..))))

Это должно привести к совпадению точек. Также есть saveAll и saveAndFlush, поэтому вы можете добавить еще несколько меток, если вам нужно их перехватить.

...