更改或覆盖 Mongorepository.save(文档)的默认行为
Change or override default Behavior of Mongorepository.save(document)
有什么方法可以在 MongoRepository.save(e)
更新之前拦截或更改 document
吗?
我正在尝试将一个子属性推送到文档中并将数组推送到文档中。我试图通过实现 converter
(使用自定义转换器)来操纵 DBObjects
,但是 $push
操作在那里不起作用。
我认为要让它工作,我必须实现类似 mongoOperation.update(dbObjectMatch,dbObjectUdate).
的东西
我发现 MongoRepositorysave(document)
不支持部分更新,即仅将更改写入现有文档。我想知道 MongoRepository.save
的内部代码来覆盖默认行为。
我已经实现了 MyRepositoryCustom
,我可以通过在 MyRepository
中扩展相同的内容来覆盖 save
,扩展 MongoRepository<T, ID extends Serializable>
然后使用 mongoTemplate.updateFirst(query,update,Clazz.class)
来实现我正在寻找但我不满意
您有多个略有不同的问题:
来自你的标题:
Change/Override Default Behaviour of Mongorepository Save() ( S save(S var1)) Method
您可以使用自定义实现来覆盖 Spring 数据存储库中现有方法的行为。请参阅 the reference documentation 如何执行此操作。你的最后一段表明你已经这样做了。很遗憾,您没有告诉我们您对此不满意的原因。
Is there any way to intercept/change before Mongorepository Save() ( S save(S var1)) method For document update.
是的,Spring 数据 MongoDB 存储库为此目的触发各种生命周期事件。再次,see the reference documentation for details。
I want to know the Internal code of Mongorepository Save
您要找的是SimpleMongoRepository.java
which delegates for almost all work to MongoTemplate.java
您正在寻找 Lifecycle Events。
覆盖存储库基方法允许您与域对象本身交互,但映射发生在 MappingMongoConverter
.
内部
保存对象将触发
等事件
这些事件带有对您保存的对象的引用。 AfterConvertEvent
还公开了对象的映射表示 (DBObject
),您可以 change/enhance.
您可以通过配置侦听器 bean 来侦听这些事件,例如 ApplicationListener<AfterConvertEvent>
。
您可以通过确保匹配自定义接口中的方法签名来片段覆盖 MongoRepository。
例如如果要覆盖 save()
方法,请创建一个新接口,如
interface CustomizedSave<T> {
<S extends T> S save(S entity);
}
实现这个接口:
@Component
class CustomizedSaveImpl<T> implements CustomizedSave<T> {
//This is optional, I added it to just show you can use it here
MongoTemplate mongoTemplate;
@Autowired
public CustomizedSaveImpl(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
public <S extends T> S save(S entity) {
// Your custom implementation
}
}
像
一样扩展基础 MongoRepository 中的接口
interface UserRepository extends CrudRepository<User, Long>, CustomizedSave<User> {
}
这将确保仅保存方法被覆盖,其余保持原样。
有什么方法可以在 MongoRepository.save(e)
更新之前拦截或更改 document
吗?
我正在尝试将一个子属性推送到文档中并将数组推送到文档中。我试图通过实现 converter
(使用自定义转换器)来操纵 DBObjects
,但是 $push
操作在那里不起作用。
我认为要让它工作,我必须实现类似 mongoOperation.update(dbObjectMatch,dbObjectUdate).
我发现 MongoRepositorysave(document)
不支持部分更新,即仅将更改写入现有文档。我想知道 MongoRepository.save
的内部代码来覆盖默认行为。
我已经实现了 MyRepositoryCustom
,我可以通过在 MyRepository
中扩展相同的内容来覆盖 save
,扩展 MongoRepository<T, ID extends Serializable>
然后使用 mongoTemplate.updateFirst(query,update,Clazz.class)
来实现我正在寻找但我不满意
您有多个略有不同的问题:
来自你的标题:
Change/Override Default Behaviour of Mongorepository Save() ( S save(S var1)) Method
您可以使用自定义实现来覆盖 Spring 数据存储库中现有方法的行为。请参阅 the reference documentation 如何执行此操作。你的最后一段表明你已经这样做了。很遗憾,您没有告诉我们您对此不满意的原因。
Is there any way to intercept/change before Mongorepository Save() ( S save(S var1)) method For document update.
是的,Spring 数据 MongoDB 存储库为此目的触发各种生命周期事件。再次,see the reference documentation for details。
I want to know the Internal code of Mongorepository Save
您要找的是SimpleMongoRepository.java
which delegates for almost all work to MongoTemplate.java
您正在寻找 Lifecycle Events。
覆盖存储库基方法允许您与域对象本身交互,但映射发生在 MappingMongoConverter
.
保存对象将触发
等事件这些事件带有对您保存的对象的引用。 AfterConvertEvent
还公开了对象的映射表示 (DBObject
),您可以 change/enhance.
您可以通过配置侦听器 bean 来侦听这些事件,例如 ApplicationListener<AfterConvertEvent>
。
您可以通过确保匹配自定义接口中的方法签名来片段覆盖 MongoRepository。
例如如果要覆盖 save()
方法,请创建一个新接口,如
interface CustomizedSave<T> {
<S extends T> S save(S entity);
}
实现这个接口:
@Component
class CustomizedSaveImpl<T> implements CustomizedSave<T> {
//This is optional, I added it to just show you can use it here
MongoTemplate mongoTemplate;
@Autowired
public CustomizedSaveImpl(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
public <S extends T> S save(S entity) {
// Your custom implementation
}
}
像
一样扩展基础 MongoRepository 中的接口interface UserRepository extends CrudRepository<User, Long>, CustomizedSave<User> {
}
这将确保仅保存方法被覆盖,其余保持原样。