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;
}
//...