Доступ события жизненного цикла MongoDB к MongoTemplate

Я пытаюсь внедрить систему управления версиями для моих документов mongodb с помощью Spring Data Mongodb. Я думал, что воспользуюсь преимуществами событий жизненного цикла Mongo.

События жизненного цикла 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) {
        // .... 
    }
}

или используйте Внедрение сеттера

Инъекция сеттера

Конфиг монго:

<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?


person eric    schedule 27.08.2012    source источник
comment
Является ли ваш класс слушателя управляемым bean-компонентом spring? Я попробовал его со ссылкой MongoTemplate @Autowired, и это сработало для меня   -  person ufasoli    schedule 05.09.2012
comment
Да, я верю, что это так. Я внес некоторые изменения, чтобы включить то, как я пытался выполнить автопроводку. Это похоже на то, как вы это сделали?   -  person eric    schedule 07.09.2012
comment
Поместите сюда также, как выглядит ваш MappingMongoConverter - похоже, вы его настроили - возможно, проблема кроется в этом. Нет проблем с добавлением автоматического внедрения в MongoTemplate в AbstractMongoEventListener в версии 1.2.0.   -  person Maciej Walkowiak    schedule 17.03.2013
comment
@eric Вы когда-нибудь решали эту проблему?   -  person Michael    schedule 16.01.2015
comment
Вы пытались реализовать ApplicationContextAware?   -  person Martin Baumgartner    schedule 23.02.2015
comment
Извините, пропустил дату :)   -  person mavarazy    schedule 24.02.2015


Ответы (1)


Я пробовал, несколько конфигураций на основе 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, хотя это не объясняет сбой внедрения установщика.

  2. Возможно, вы где-то переопределяете имя компонента

И многое другое.

В любом случае, проблема заключается в том, как вы используете Spring, а не в предоставленных вами конфигурациях Spring, все в порядке.

person mavarazy    schedule 24.02.2015