在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.
来实现我的目标我正在寻找但我并不满意。
答案 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>
。