Не найдено свойство null в классе сущностей java.time.ZonedDateTime для привязки параметра конструктора к

у меня следующая конфигурация

Конфигурация

@Configuration
@EnableMongoRepositories(basePackages = Constants.DATA_SCAN)
@EnableMongoAuditing(auditorAwareRef = "auditorAwareService")
@Import(value = MongoAutoConfiguration.class)
public class DatabaseConfiguration {

    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public CustomConversions customConversions() {
        final List<Converter<?, ?>> converters = new ArrayList<>();
        converters.add(DateToZonedDateTimeConverter.INSTANCE);
        converters.add(ZonedDateTimeToDateConverter.INSTANCE);
        return new CustomConversions(converters);
    }
}

Я добавил пользовательские конвертеры, но все еще получаю:

Не найдено свойство null в классе сущностей java.time.ZonedDateTime для привязки параметра конструктора!

@Document(collection = "user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private String id;

    @Field("reset_date")
    private ZonedDateTime resetDate = null;
}

пом.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Преобразователь класса

public final class JSRConverters {

    private JSRConverters() {}

    public static class ZonedDateTimeToDateConverter implements Converter<ZonedDateTime, Date> {

        public static final ZonedDateTimeToDateConverter INSTANCE = new ZonedDateTimeToDateConverter();

        private ZonedDateTimeToDateConverter() {}

        @Override
        public Date convert(final ZonedDateTime source) {
            return source == null ? null : Date.from(source.toInstant());
        }
    }

    public static class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {

        public static final DateToZonedDateTimeConverter INSTANCE = new DateToZonedDateTimeConverter();

        private DateToZonedDateTimeConverter() {}

        @Override
        public ZonedDateTime convert(final Date source) {
            return source == null ? null : ZonedDateTime.ofInstant(source.toInstant(), ZoneId.systemDefault());
        }
    }
}

person Saurabh Kumar    schedule 09.02.2017    source источник
comment
Можете ли вы добавить остальную часть кода и конфигурации? Вы используете MongoRepository или MongoTemplate ? Я продолжаю получать No bean named 'mongoTemplate' available, когда пытаюсь использовать ваш код.   -  person s7vr    schedule 09.02.2017
comment
открытый интерфейс UserRepository расширяет MongoRepository‹User, String› {..}   -  person Saurabh Kumar    schedule 09.02.2017
comment
Похоже, CustomConversions не вызываются   -  person Saurabh Kumar    schedule 10.02.2017
comment
Я не могу запустить вашу установку. Но если мне нужно угадать, попробуйте использовать @Import(value = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})   -  person s7vr    schedule 10.02.2017
comment
Нет такого же исключения даже после добавления MongoDataAutoConfiguration.   -  person Saurabh Kumar    schedule 10.02.2017
comment
поэтому я пробовал следующее github.com/jhipster/jhipster-sample-app-mongodb но похоже, что это не работает   -  person Saurabh Kumar    schedule 10.02.2017
comment
Я ответил что-то подобное здесь -с-mongodb/. Посмотрите, поможет ли это.   -  person s7vr    schedule 10.02.2017
comment
да, я видел это и пробовал, но не повезло.   -  person Saurabh Kumar    schedule 10.02.2017
comment
Можете ли вы создать минимальный, полный и проверяемый?   -  person s7vr    schedule 12.02.2017
comment
Попробуйте удалить нулевое назначение по умолчанию для resetDate. это может вызвать проблемы с аннотацией   -  person Stephan    schedule 16.05.2018


Ответы (1)


у меня работает та же установка, но с использованием org.springframework.data.mongodb.core.convert.MongoCustomConversions вместо org.springframework.data.mongodb.core.convert.CustomConversions

@Bean
public MongoCustomConversions customConversions() {

    final List<Converter> converters = new ArrayList<>();
    converters.add(new ZonedDateTimeFromDateConverter());
    converters.add(new ZonedDateTimeToDateConverter());

    return new MongoCustomConversions(converters);
}

и еще один совет: монго возвращает дату в формате UTC (https://docs.mongodb.com/manual/reference/method/Date/), это означает, что вы получите время в формате UTC, а не в ZoneId.systemDefault(). Мой десериализатор выглядит так:

private static final ZoneId DEFAULT_ZONE_READ = ZoneId.of("UTC");

public static class ZonedDateTimeFromDateConverter implements Converter<Date, ZonedDateTime> {
    @Override
    public ZonedDateTime convert(Date date) {
        return date.toInstant().atZone(DEFAULT_ZONE_READ);
    }
}
person hyphen    schedule 02.06.2018