Весенние данные MongoDB не видит включенными по умолчанию Joda-Time converter

StackOverflow https://stackoverflow.com//questions/21034351

Вопрос

Я пытаюсь просто сохранить документ с помощью 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) должны быть включены По умолчанию когда Jara времени Joda находится на пути к классу.К сожалению, мой тест завершается неудачей с:

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 конветер?

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top