更改或覆盖 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> {
}

这将确保仅保存方法被覆盖,其余保持原样。

文档:https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.single-repository-behavior