Spring-Data-MongoDB: не удалось преобразовать из типа после обновления до 2.0.7 с пользовательским преобразователем - PullRequest
0 голосов
/ 11 мая 2018

Я только что обновился до Spring Boot 2.0.2 сегодня и как часть этого также до Spring-Data-MongoDB 2.0.7.

У меня есть следующая сущность:

@Document
@Data
public class User {
private String username;
private String password;
private List<String> authorities;

    public User(String username, String password, List<String> authorities) {
        this.username = username;
        this.password = password;
        this.authorities = authorities;
    }
}

В моем тесте я вставляю нового пользователя, используя следующее:

mongoTemplate.save(new User("testuser", "$2a$04$OuKj.lXzPxlwgr2Jy28E4ehHuxnVZ7BuL46qX9fd6vAijcDN6UeHe", Collections.singletonList("user")));

Это отлично работало при использовании Spring Boot 2.0.1 (соответственно Spring-Data-MongoDB 2.0.6).В обновленной версии Spring-Data-MongoDB я получаю следующую ошибку:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime] for value 'testuser'; nested exception is java.time.format.DateTimeParseException: Text 'testuser' could not be parsed at index 0

    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:46)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:191)
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getPotentiallyConvertedSimpleWrite(MappingMongoConverter.java:849)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeSimpleInternal(MappingMongoConverter.java:829)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeProperties(MappingMongoConverter.java:488)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:462)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:436)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:391)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:86)
    at org.springframework.data.mongodb.core.MongoTemplate.toDocument(MongoTemplate.java:1070)
    at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1253)
    at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:1201)
    at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:1185)
....
Caused by: java.time.format.DateTimeParseException: Text 'testuser' could not be parsed at index 0
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at at.riag.scanpay.config.MongoConfig$StringToZonedDateTime.convert(MongoConfig.java:34)
    at at.riag.scanpay.config.MongoConfig$StringToZonedDateTime.convert(MongoConfig.java:28)
    at org.springframework.core.convert.support.GenericConversionService$ConverterAdapter.convert(GenericConversionService.java:385)
    at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:40)
    ... 71 more

Так что, похоже, он хочет преобразовать username в ZonedDateTime.Проблема может быть в моем MongoConfig, где у меня есть пользовательские конвертеры для ZonedDateTime:

@Configuration
public class MongoConfig {

    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

    @Bean
    public MongoCustomConversions customConversions(){
        List<Converter<?,?>> converters = new ArrayList<>();
        converters.add(ZonedDateTimeToStringConverter.INSTANCE);
        converters.add(StringToZonedDateTime.INSTANCE);
        return new MongoCustomConversions(converters);
    }

    enum StringToZonedDateTime implements Converter<String, ZonedDateTime> {

        INSTANCE;

        @Override
        public ZonedDateTime convert(String source) {
            return ZonedDateTime.parse(source, dateTimeFormatter);
        }
    }

    enum ZonedDateTimeToStringConverter implements Converter<ZonedDateTime, String> {

        INSTANCE;

        @Override
        public String convert(ZonedDateTime source) {
            return dateTimeFormatter.format(source);
        }
    }
}

Эти конвертеры, конечно, не должны использоваться для простой строки, но кажется, что она запускается при использовании новой SpringДанные MongoDB версия.Кто-нибудь может указать мне на проблему с моим кодом или есть проблема с последней версией?

Заранее спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Spring Data MongoDB 2.0.7 считает ZonedDateType простым типом. Необходимо преобразовать конвертеры в конвертеры для чтения и записи, добавив @ReadingConverter / @WritingConverter.

В приведенной выше схеме фреймворк пытается преобразовать все значения String в ZonedDateTime. Вместо этого вы хотите представлять ZonedDateTime объекты как String в вашем MongoDB. Поэтому добавление @WritingConverter к ZonedDateTimeToStringConverter и @ReadingConverter к другому исправит вашу проблему.

...