12

Spring Data Mongodb を使用して、mongodb ドキュメントのバージョン管理システムを実装しようとしています。Mongo のライフサイクル イベントを活用しようと思った

春の 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/PHP での方法

Doctrine の場合、ライフサイクル コールバックで Document Manager への参照を取得します。Spring Dataでこれと同じことを行う方法の手がかりはありますか?

4

1 に答える 1

0

私は試しましたが、Javaベースの構成はほとんどありません

  1. 明示的なパラメーターを使用:

    @Configuration
    public static class ListenerConfiguration {
    
       @Bean
       public TableListener tableListener(MongoOperations mongoOperations) {
           return new TableListener(mongoOperations);
       }
    
    }
    
  2. @自動配線付き

    @Configuration
    public static class ListenerConfiguration {
    
        @Bean
        public TableListener tableListener() {
            return new TableListener();
        }
    
    }
    

すべてが完璧に機能しました。

  1. 1つのオプションは-追加するのを忘れただけです

    <context:annotation-config/>
    

    ただし、これはセッター注入の失敗を説明するものではありません。

  2. Bean 名のオーバーライドがどこかにある可能性があります

などなど。

とにかく、問題はSpringの使用方法にあり、提供したSpring構成にはありません。問題ありません。

于 2015-02-24T06:57:03.370 に答える