При сохранении объекта, содержащего новую Java 8 java.time. LocalDateTime
, выдается следующая ошибка:
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.time.LocalDateTime] to type [java.util.Date]
Проверенный
- Пружина 4.3.2. ВЫПУСК
- Весенние данные MongoDB 1.9.2.РЕЛИЗ
Поддерживает ли Spring-data новые API-интерфейсы Java 8 Date (JSR-310)?
1. Весенние данные + JSR-310
Да, Spring-data поддерживает спецификацию JSR-310 с пользовательским преобразователем – Преобразователи JSR310
, просмотрите следующий фрагмент кода:
package org.springframework.data.mongodb.core.convert; public class CustomConversions { /** * Creates a new {@link CustomConversions} instance registering the given converters. * * @param converters */ public CustomConversions(List> converters) { //... List
2. Решение
Вышеупомянутые jsr310конвертеры
будут включены, если вы объявили управляемый компонент Spring для MappingMongoConverter
и передадите в качестве аргумента для MongoTemplate
, просмотрите следующий пример конфигурации Mongo:
//... import org.springframework.data.mongodb.core.convert.MappingMongoConverter; @Configuration @ComponentScan(basePackages = {"com.mkyong.db"}) public class MongoConfig { //... @Autowired MongoDbFactory mongoDbFactory; @Bean public MongoTemplate mongoTemplate() throws Exception { MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, getDefaultMongoConverter()); return mongoTemplate; } @Bean public MappingMongoConverter getDefaultMongoConverter() throws Exception { MappingMongoConverter converter = new MappingMongoConverter( new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext()); return converter; } //... }
Сопоставляющий монгоконвертер
расширяет Абстрактный монгоконвертер
, и Абстрактный МонгоКонвертер
является инициализирующим элементом
. Если это объявлено как компонент, управляемый Spring, через @Bean
, будет запущен afterPropertiesSet()
и будут зарегистрированы все преобразователи по умолчанию, включая преобразователи JSR310
3. Часто задаваемые вопросы
Если MappingMongoConverter
не управляется Spring (в нем используется ключевое слово new
, как показано ниже), необходимо вызвать .afterPropertiesSet ()
вручную.
@Configuration @ComponentScan(basePackages = {"com.mkyong.db"}) public class MongoConfig { @Autowired MongoDbFactory mongoDbFactory; @Bean public MongoTemplate mongoTemplate() throws Exception { MappingMongoConverter converter = new MappingMongoConverter( new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext()); //CALL THIS MANULLY, so that all the default convertors will be registered! converter.afterPropertiesSet(); MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter); return mongoTemplate; } //...
Рекомендации
- Github – Пользовательские конвертеры в spring-данные-mongodb
- Весенний IO–картографический монгоконвертер javadoc
- Spring IO – Пользовательские преобразования javadoc
Оригинал: “https://mkyong.com/mongodb/spring-data-mongodb-jsr-310-or-java-8-new-date-apis/”