Решено как было предложено от Naros .
Логика pre-persist и pre-update перемещена в отдельный инъецируемый компонент, и AuditListener
делегирует выполнение различным реализациям этого компонента в зависимости от текущего активного профиля.
Для Spring Boot 2.1.0:
Общий интерфейс:
public interface AuditManager {
void performPrePersistLogic(Auditable auditable);
void performPreUpdateLogic(Auditable auditable);
}
Слушатель для JPAобратные вызовы:
@Component
@RequiredArgsConstructor
public class AuditListener {
private final AuditManager auditManager;
@PrePersist
public void setCreatedOn(Auditable auditable) {
auditManager.performPrePersistLogic(auditable);
}
@PreUpdate
public void setUpdatedOn(Auditable auditable) {
auditManager.performPreUpdateLogic(auditable);
}
}
Реализации общего интерфейса для тестовой среды и локальной среды:
@RequiredArgsConstructor
public class AuditChanger implements AuditManager {
private final UserService userService;
private final AuditService auditService;
@Override
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
public void performPrePersistLogic(Auditable auditable) {
// logic here
}
@Override
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
public void performPreUpdateLogic(Auditable auditable) {
// logic here
}
}
public class AuditNoChanger implements AuditManager {
// mostly similar
...
Конфигурация, которая позволяет Spring выполнять внедрение различных реализаций в зависимости от текущего активного профиля:
@Configuration
public class AuditConfig {
@Bean
@Profile("e2e")
public AuditManager getAuditNoChanger() {
return new AuditNoChanger();
}
@Bean
@Profile("local")
public AuditManager getAuditChanger(AuditService auditService,
CurrentUserService currentUserService) {
return new AuditChanger(auditService, currentUserService);
}
}
Также необходимо разрешить переопределение bean-компонентов в файле * .yml:
spring:
main:
allow-bean-definition-overriding: true