Spring Data Mongodb を使用して、mongodb ドキュメントのバージョン管理システムを実装しようとしています。Mongo のライフサイクル イベントを活用しようと思った
私がやりたかったのはonBeforeSave
、元のバージョンのドキュメントを聞いて取得し、2 つの間の差分を取得することでした。
@Override
public void onBeforeSave(Table table, DBObject dbo) {
if (table.getId() != null) {
TableChange change = new TableChange();
Table beforeTable = mongoOperations.findById(table.getId(), Table.class);
if (!beforeTable.getName().equals(table.getName())) {
change.setName(table.getName());
}
MapDifference<String, Column> diff = Maps.difference(beforeTable.getColumns(), table.getColumns());
logger.debug(diff.entriesInCommon().toString());
logger.debug(diff.entriesDiffering().toString());
logger.debug(diff.entriesOnlyOnLeft().toString());
logger.debug(diff.entriesOnlyOnRight().toString());
table.addChange(change);
}
}
私が抱えている問題は、mongoOperations への参照を取得できないことです。循環参照を作成し続けます。私が@Autowireかどうか:
オートワイヤー注入
モンゴの設定:
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
<constructor-arg name="mongoConverter" ref="fooConverter" />
<property name="writeResultChecking" value="EXCEPTION" />
</bean>
<bean class="com.example.listener.document.TableListener"></bean>
リスナー:
public class TableListener extends AbstractMongoEventListener<Table> {
private static final Logger logger = LoggerFactory.getLogger(TableListener.class);
@Autowired MongoTemplate mongoTemplate;
@Override
public void onBeforeSave(Table table, DBObject dbo) {
// ....
}
}
セッター注入
モンゴの設定:
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
<constructor-arg name="mongoConverter" ref="fooConverter" />
<property name="writeResultChecking" value="EXCEPTION" />
</bean>
<bean class="com.example.listener.document.TableListener">
<property name="mongoTemplate" ref="mongoTemplate" />
</bean>
リスナー:
public class TableListener extends AbstractMongoEventListener<Table> {
private static final Logger logger = LoggerFactory.getLogger(TableListener.class);
private MongoTemplate mongoTemplate;
public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@Override
public void onBeforeSave(Table table, DBObject dbo) {
// ....
}
}
ライフサイクル イベントでドキュメントのバージョン管理を処理することは、私にとって理にかなっています。PHP/Doctrine/Mongoで同様のことをしました
Doctrine の場合、ライフサイクル コールバックで Document Manager への参照を取得します。Spring Dataでこれと同じことを行う方法の手がかりはありますか?