更改或覆盖Mongorepository.save的默认行为(文档)

时间:2017-04-27 04:05:21

标签: java spring mongodb spring-data spring-data-mongodb

document更新之前有没有办法拦截或更改MongoRepository.save(e)

我正在尝试在文档中推送子属性和数组。我试图通过实施DBObjects(使用自定义转换器)来操纵converter,但$push操作在那里无效。

我认为要实现它,我必须实现像mongoOperation.update(dbObjectMatch,dbObjectUdate).

这样的东西

我发现MongoRepositorysave(document)不支持部分更新,即只写入对现有文档的更改。我想知道MongoRepository.save的内部代码,以覆盖默认行为。

我已经实施了MyRepositoryCustom,我可以通过在save中扩展MyRepository来覆盖MongoRepository<T, ID extends Serializable>mongoTemplate.updateFirst(query,update,Clazz.class)扩展foreach ($get_cont as $line) { #var_dump($line); if (strpos($line, "a href")) { #echo "$line"; $get_core++; if ($get_core == 3) { #echo $line; break 1; } } } #echo $line; $array = explode(' ', $line); $core = $array[count($array) - 1]; $core = substr_replace($core, "", -1); $cmd = "cmd /c curl http://" . $server["server_name"] . ":" . $server["port"] . "/solr" . "/" . $core . "/admin/registry.jsp"; var_dump($cmd); ,然后使用cmd /c curl http://server_name:8080/solr/"value of variable core"/admin/registry.jsp. 来实现我的目标我正在寻找但我并不满意。

2 个答案:

答案 0 :(得分:3)

您有多个略有不同的问题:

从你的标题:

  

更改/覆盖Mongorepository Save()的默认行为(S save(S var1))方法

您可以使用自定义实现来覆盖Spring Data存储库中现有方法的行为。请参阅the reference documentation如何操作。你的最后一段暗示你已经这样做了。不幸的是,你不能告诉我们为什么你对此并不满意。

  

在Mongorepository Save()(S save(S var1))方法之前是否有任何方法可以拦截/更改文档更新。

是的,Spring Data MongoDB存储库会为此目的触发各种生命周期事件。再次see the reference documentation for details

  

我想知道Mongorepository Save的内部代码

您所寻找的是SimpleMongoRepository.java,它将几乎所有工作委托给MongoTemplate.java

答案 1 :(得分:3)

您正在寻找Lifecycle Events

覆盖存储库基础方法允许您与域对象本身进行交互,但映射发生在MappingMongoConverter内。

保存对象将触发

等事件

这些事件带有对已保存对象的引用。 AfterConvertEvent还会公开您可以更改/增强的对象的映射表示(DBObject)。

您可以通过配置监听器Bean(例如ApplicationListener<AfterConvertEvent>

来侦听这些事件