Spring Data MongoDB + JSR-310 или новые API даты Java 8
При сохранении объекта, содержащего новый Java 8java.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.РЕЛИЗ
-
Spring Data MongoDB 1.9.2.РЕЛИЗ
Поддерживает ли Spring-data новые API-интерфейсы Java 8 Date (JSR-310)?
1. Spring Data + JSR-310
Да, Spring-data поддерживает спецификацию JSR-310 с настраиваемым преобразователем -Jsr310Converters
, просмотрите следующий фрагмент кода:
CustomConversions.java
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. Решение
ВышеупомянутыйJsr310Converters
будет включен, если вы объявили управляемый bean-компонент Spring дляMappingMongoConverter
и передали его в качестве аргумента дляMongoTemplate
, просмотрите следующий пример MongoConfig:
MongoConfig.java
//... import org.springframework.data.mongodb.core.convert.MappingMongoConverter; @Configuration @ComponentScan(basePackages = {"com.example.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; } //... }
MappingMongoConverter
расширяетAbstractMongoConverter
, аAbstractMongoConverter
являетсяInitializingBean
. Если это объявлено как управляемый компонент Spring через@Bean
, будет запущенafterPropertiesSet()
, и будут зарегистрированы все преобразователи по умолчанию, включаяJsr310Converters
3. FAQs
ЕслиMappingMongoConverter
не управляется Spring (init с ключевым словомnew
, как показано ниже), вы должны вызвать.afterPropertiesSet()
вручную.
MongoConfig.java
@Configuration @ComponentScan(basePackages = {"com.example.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; } //...