简体   繁体   English

MongoDB 找不到能够从 [java.lang.String] 类型转换为 [java.time.LocalDateTime] 类型的转换器

[英]MongoDB No converter found capable of converting from type [java.lang.String] to type [java.time.LocalDateTime]

MongoDB, Spring Data, findAll() method error: MongoDB、Spring Data、findAll() 方法错误:

No converter found capable of converting from type [java.lang.String] to type [java.time.LocalDateTime]找不到能够从 [java.lang.String] 类型转换为 [java.time.LocalDateTime] 类型的转换器

public class EntityName {
    @Id
    private String id;
    private Map<LocalDateTime, Integer> statistic;
}

I am able to save entity, but not able to load it.我能够保存实体,但无法加载它。 Any quick fixes?任何快速修复?

This solved the problem:这解决了这个问题:

@Configuration
public class MongoConfiguration extends AbstractMongoConfiguration {

    @Value("${spring.data.mongodb.database:test}")
    private String database;

    @Value("${spring.data.mongodb.host:localhost}:${spring.data.mongodb.port:27017}")
    private String host;

    @Autowired
    private MappingMongoConverter mongoConverter;

    // Converts . into a mongo friendly char
    @PostConstruct
    public void setUpMongoEscapeCharacterConversion() {
        mongoConverter.setMapKeyDotReplacement("_");
    }

    @Override
    protected String getDatabaseName() {
        return database;
    }

    @Override
    public Mongo mongo() throws Exception {
        return new MongoClient(host);
    }

    @Bean
    @Override
    public CustomConversions customConversions() {
        List<Converter<?, ?>> converterList = new ArrayList<Converter<?, ?>>();
        converterList.add(new MongoLocalDateTimeFromStringConverter());
        return new CustomConversions(converterList);
    }

    private static final class MongoLocalDateTimeFromStringConverter implements Converter<String, LocalDateTime> {
        @Override
        public LocalDateTime convert(String source) {
            return source == null ? null : LocalDateTime.parse(source);
        }
    }
}

@Maksym's way has helped me as well. @Maksym 的方式也帮助了我。 I had to adjust it a little bit for Spring Framework 5 and Spring Boot 2:我不得不为 Spring Framework 5 和 Spring Boot 2 稍微调整一下:

@Bean
@Primary
public MappingMongoConverter mongoConverter(
        @Autowired MongoMappingContext mongoMappingContext,
        @Autowired MongoDbFactory mainMongoFactory,
        @Autowired MongoCustomConversions conversions
) {
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mainMongoFactory);
    MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
    mongoConverter.setMapKeyDotReplacement("#");
    mongoConverter.afterPropertiesSet();
    mongoConverter.setCustomConversions(conversions);
    return mongoConverter;
}


@Bean
public MongoMappingContext mongoMappingContext() {
    MongoMappingContext context = new MongoMappingContext();
    context.setSimpleTypeHolder(new SimpleTypeHolder(new HashSet<>(Arrays.asList(
            DateTime.class,
            LocalDateTime.class
    )), MongoSimpleTypes.HOLDER));
    return context;
}

@Bean
public MongoCustomConversions customConversions() {
    List<Converter<?, ?>> converterList = new ArrayList<Converter<?, ?>>();
    converterList.add(new MongoLocalDateTimeFromStringConverter());
    converterList.add(new MongoDateTimeFromStringConverter());
    return new MongoCustomConversions(converterList);
}

private static final class MongoLocalDateTimeFromStringConverter implements Converter<String, LocalDateTime> {
    @Override
    public LocalDateTime convert(String source) {
        return source == null ? null : LocalDateTime.parse(source);
    }
}

private static final class MongoDateTimeFromStringConverter implements Converter<String, DateTime> {
    @Override
    public DateTime convert(String source) {
        return source == null ? null : DateTime.parse(source);
    }
}

Ref - https://github.com/lordofthejars/nosql-unit#dataset-format参考 - https://github.com/lordofthejars/nosql-unit#dataset-format

If you want to use ISODate function or any other javascript function you should see how MongoDB Java Driver deals with it.如果您想使用 ISODate 函数或任何其他 javascript 函数,您应该查看 MongoDB Java Driver 如何处理它。 For example in case of ISODate:例如在 ISODate 的情况下:

In your json file use $date for conversion在您的 json 文件中使用 $date 进行转换

"bornAt":{ "$date" : "2011-01-05T10:09:15.210Z"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 找不到能够从类型 [java.time.LocalDateTime] 转换为类型 [java.util.Date] 的转换器 - No converter found capable of converting from type [java.time.LocalDateTime] to type [java.util.Date] 找不到能够从类型 [java.util.LinkedHashMap 进行转换的转换器<?, ?> ] 输入 [java.lang.String] - Spring 配置服务器 - No converter found capable of converting from type [java.util.LinkedHashMap<?, ?>] to type [java.lang.String] - Spring config server 无法将类型java.lang.String的属性值转换为所需的类型java.time.LocalDateTime - Failed to convert property value of type java.lang.String to required type java.time.LocalDateTime 找不到能够从类型 [java.time.LocalDate] 转换为类型 [@org.springframework.data.jpa.repository.Query java.lang.String] 的转换器 - No converter found capable of converting from type [java.time.LocalDate] to type [@org.springframework.data.jpa.repository.Query java.lang.String] 找不到能够从 [java.lang.String] 类型转换为 [@Autowired @ManyToOne @JoinColumn com.papertrue.country.Country] 类型的转换器 - No converter found capable of converting from type [java.lang.String] to type [@Autowired @ManyToOne @JoinColumn com.papertrue.country.Country] Spring MVC“找不到能够将java.lang.String类型转换为org.springframework.core.io.Resource类型的转换器” - Spring MVC “No converter found capable of converting from type java.lang.String to type org.springframework.core.io.Resource” org.springframework.core.convert.ConverterNotFoundException:找不到能够从 [java.lang.String] 类型转换为 Model 类型的转换器 - org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type Model 如果使用spring-data-rest,则找不到能够从[java.lang.String]类型转换为[com.google.cloud.datastore.Key]类型的转换器错误 - No converter found capable of converting from type [java.lang.String] to type [com.google.cloud.datastore.Key] error if spring-data-rest is used 无法从 String 反序列化 java.time.LocalDateTime 类型的值 - Can not deserialize value of type java.time.LocalDateTime from String Spring 数据 Elasticsearch - 找不到能够从类型 [java.lang.Long] 转换为类型 [java.time.Instant] 的转换器 - Spring Data Elasticsearch - No converter found capable of converting from type [java.lang.Long] to type [java.time.Instant]
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM