12

我正在尝试使用 Spring Data Mongodb 为我的 mongodb 文档实现版本控制系统。我以为我会利用 Mongo 生命周期事件

Spring 中的 Mongo 生命周期事件

我想做的是收听onBeforeSave并获取文档的原始版本,并获取两者之间的差异。

@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) {
        // .... 
    }
}

或使用Setter 注入

二传手注入

蒙哥配置:

<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. 使用@Autowired

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

所有这些都完美无缺。

  1. 一种选择是 - 您只是忘记添加

    <context:annotation-config/>
    

    在您的 xml 配置中,尽管这不能解释 setter 注入失败。

  2. 您可能在某处有 bean 名称覆盖

还有很多。

无论如何,问题在于您如何使用Spring,而不是您提供的spring配置,这很好。

于 2015-02-24T06:57:03.370 回答