Spring Data MongoDB не видит включенного по умолчанию конвертера Joda-Time

Я пытаюсь просто сохранить документ с полем org.joda.time.DateTime из Joda-Time.

@Document
public class JodaDoc {

    @Id
    private BigInteger id;

    private String dateAsString;

    private DateTime date;

    public JodaDoc(String dateAsString, DateTime date) {
        this.dateAsString = dateAsString;
        this.date = date;
    }

    public BigInteger getId() { return id; }

    public String getDateAsString() { return dateAsString; }

    public DateTime getDate() { return date; }
}

Стандартная конфигурация приложения с использованием AbstractMongoConfiguration из spring-data-mongodb:

@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

Тест, который явно использует класс AppConfig (со Spock, но используются внутренние механизмы, предоставляемые spring-test):

@ContextConfiguration(classes = AppConfig)
class JodaDocRepositorySpec extends Specification {

    @Autowired
    private JodaDocRepository jodaDocRepository

    def "save document with DateTime"() {
        given:
            def jodaDoc = new JodaDoc(DateTime.now())
        when:
            def savedJodaDoc = jodaDocRepository.save(jodaDoc)
        then:
            savedJodaDoc.id
    }
}

Преобразователи Joda-Time в Spring Data MongoDB (а также в самом Spring Core) должны быть включены с помощью по умолчанию, когда jar Joda-Time находится в пути к классам. К сожалению, мой тест не работает с:

org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type org.joda.time.DateTime to type java.util.Date

Я попытался добавить DefaultFormattingConversionService:

@Bean
public ConversionService conversionService() {
    return new DefaultFormattingConversionService();
}

ConversionServiceFactoryBean и несколько других вещей, которые не дают никакого эффекта. Я не смог найти ответ на StackOverflow.

Вопрос. Почему Spring Data MongoDB не видит стандартный конвертер org.joda.time.DateTime -> java.util.Date?


person Marcin Zajączkowski    schedule 10.01.2014    source источник


Ответы (1)


Мне потребовалось некоторое время, и я хочу поделиться решением с другими.

Я создал небольшое приложение для быстрого запуска и не смог воспроизвести проблему. В конце концов я обнаружил, что проблема заключалась в отсутствующей аннотации @Configuration в моем классе конфигурации. С участием:

@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }

он просто отлично работает.

Я часто опускал @Configuration для класса конфигурации, когда он явно зарегистрирован в контексте (классами в @ContextConfiguration или методом register() в AnnotationConfigWebApplicationContext). Классы все равно обрабатывались, и все объявленные bean-компоненты были найдены. Иногда полезно не использовать @Configuration для предотвратить обнаружение при сканировании компонентов, когда в одних и тех же пакетах в тестовом контексте, используемом разными тестами, есть 2 похожих класса конфигурации.Это сгенерировало другой вопрос, так как я не уверен, что это желаемое поведение.

person Marcin Zajączkowski    schedule 10.01.2014
comment
На упомянутый вопрос есть интересный ответ. - person Marcin Zajączkowski; 28.01.2014