MongoTemplate
работает следующим образом на doInsert()
this.maybeEmitEvent
- генерирует событие (onBeforeConvert
, onBeforeSave
и т. Д.), Поэтому любой AbstractMappingEventListener
может поймать и действовать так же, как вы сделали с GenerateUUIDListener
this.maybeCallBeforeConvert
- вызов до преобразования обратные вызовы как mongo auditing
как у вас можно видеть в исходном коде MongoTemplate.class
sr c (831-832)
protected <T> T doInsert(String collectionName, T objectToSave, MongoWriter<T> writer) {
BeforeConvertEvent<T> event = new BeforeConvertEvent(objectToSave, collectionName);
T toConvert = ((BeforeConvertEvent)this.maybeEmitEvent(event)).getSource(); //emit event
toConvert = this.maybeCallBeforeConvert(toConvert, collectionName); //call some before convert handlers
...
}
MongoAudit
отмечает createdAt
только для новых объектов, проверяя, если entity.isNew() == true
поскольку ваш код (UUID) уже установил Id
, createdAt
не заполняется (сущность не считается новой)
, вы можете сделать следующее (от лучшего к худшему):
- забудьте о
UUID
и используйте String
для своего идентификатора, пусть mon go сам создает и управляет идентификаторами своих сущностей (вот как MongoTemplate
на самом деле работает строки 811-812) - сохранить
UUID
на уровне кода, преобразовать из / в String
при вставке и извлечении из базы данных - создать собственный репозиторий, как в этом post
- остаться с * 1 051 *
- установить
updateAt
на GenerateUUIDListener
, а также id
(переименовать его NewEntityListener
или что-л.), В основном реализовать аудит - внедрить новый
isNew()
logi c, который не зависит только от сущности id
в версии 2.1.11.RELEASE
порядок методов был изменен (MongoTemplate.class
804 -805) чтобы ваш код работал нормально
в качестве абстрактного подхода, характер события должен быть своего рода отправкой и забыванием (совместимым с asyn c), так что это очень плохая практика для изменения самого объекта существует NO грантополучатель для порядка вычисления, если таковой имеется
, поэтому аудит основывается на обратных вызовах , а не событиях , и именно поэтому Pivotal не (должен) поддерживать порядок между версиями