Весенние данные MongoDB не видит включенными по умолчанию Joda-Time converter
-
21-12-2019 - |
Вопрос
Я пытаюсь просто сохранить документ с помощью 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 похожих класса конфигурации в тестовом контексте, используемых разными тестами.Это породило еще один вопрос поскольку я не уверен, является ли это желаемым поведением.