Spring не использует пользовательские конвертеры mongo

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

public class EventKeyConverter implements Converter<Event,DBObject> {

    @Override
    public DBObject convert(Event object) {
        DBObject dbObject = DBObjectTransformer.toDBObject(object);
        dbObject.put("_id", KeyGenerator.getRandomKey());
        return dbObject;
    }

}

вот место, где я зарегистрировал преобразователь клиента

@Override
@Bean
public CustomConversions customConversions() {
    List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
    converters.add(new EventKeyConverter());
    return new CustomConversions(converters);
}

@Override
@Bean
public MappingMongoConverter mappingMongoConverter() throws Exception {
    MappingMongoConverter converter = new MappingMongoConverter(
            eventsMongoDbFactory(), mongoMappingContext());
    converter.setCustomConversions(customConversions());
    return converter;
}

@Bean
public MongoTemplate eventsMongoTemplate() throws Exception {
    final MongoTemplate template = new MongoTemplate(
            eventsMongoDbFactory(), mappingMongoConverter());
    template.setWriteResultChecking(WriteResultChecking.EXCEPTION);

    return template;
}

Когда я сохраняю некоторые объекты, этот преобразователь никогда не вызывается.


Редактировать 1: мне нужно изменить идентификатор объекта по умолчанию на какой-то пользовательский идентификатор (UUID + случайный ключ) во всех репозиториях. Вот почему я попытался использовать конвертер монго.

Редактировать 2: только что обнаружил проблему. Измените @Configuration на @Component в классе, который содержит customConversion(), и он отлично работает. Но все же интересно, что здесь произошло?


person Rajith Delantha    schedule 18.02.2013    source источник
comment
Не могли бы вы показать, как вы на самом деле сохраняете объекты? Я имею в виду, зачем вам нужно преобразовывать POJO в фактический BSON, чтобы сохранить его в БД?   -  person user    schedule 18.02.2013
comment
Мне нужно изменить идентификатор объекта по умолчанию на какой-то пользовательский идентификатор (UUID + случайный ключ) во всех репозиториях. Вот почему я попытался использовать конвертер монго.   -  person Rajith Delantha    schedule 19.02.2013
comment
Раджит, в mongodb вам не разрешено обновлять поля _id. Если вы хотите добавить новые объекты с настраиваемым _id, вы должны предоставить необходимое поле с аннотацией @Id и при вставке объекта вручную установить _id.   -  person user    schedule 19.02.2013
comment
просто хочу сделать то же самое. static.springsource.org/spring-data/data-mongo/docs/1.0.0.M5/   -  person Rajith Delantha    schedule 19.02.2013
comment
У меня работает - я поставил тег @Component, и теперь Spring использует мои преобразователи   -  person Ido Cohn    schedule 28.07.2013


Ответы (1)


@Configuration определяет фрагмент контекста Spring, который содержит методы, которые при аннотации @Bean возвращают новые компоненты и помещают их в контекст.

@Component — это способ сказать «этот Pojo — это Spring bean». Затем вам потребуется аннотация @ComponentScan или XML-эквивалент для сканирования пакетов на наличие @Component аннотированных компонентов.

Итак, в вашем случае вы создали преобразователь в порядке, но он не был зарегистрирован как компонент Spring, пока вы не добавили @Component, поэтому изначально он не работал.

person PaulNUK    schedule 15.08.2014