Рубрики
Без рубрики

Весенние данные MongoDB + JSR-310 или Java 8 новые API-интерфейсы даты

– Весенние данные MongoDB + JSR-310 или Java 8 новые API-интерфейсы даты

При сохранении объекта, содержащего новую 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]

Проверенный

  1. Пружина 4.3.2. ВЫПУСК
  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 toRegister = new ArrayList();

		// Add user provided converters to make sure they can override the defaults
		toRegister.addAll(converters);
		toRegister.add(CustomToStringConverter.INSTANCE);
		toRegister.addAll(MongoConverters.getConvertersToRegister());
		toRegister.addAll(JodaTimeConverters.getConvertersToRegister());
		toRegister.addAll(GeoConverters.getConvertersToRegister());
		toRegister.addAll(Jsr310Converters.getConvertersToRegister());
		toRegister.addAll(ThreeTenBackPortConverters.getConvertersToRegister());

		for (Object c : toRegister) {
			registerConversion(c);
		}

		//...
	}

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;

    }

	//...

Рекомендации

  1. Github – Пользовательские конвертеры в spring-данные-mongodb
  2. Весенний IO–картографический монгоконвертер javadoc
  3. Spring IO – Пользовательские преобразования javadoc

Оригинал: “https://mkyong.com/mongodb/spring-data-mongodb-jsr-310-or-java-8-new-date-apis/”