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

9

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

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

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

我能保存实体,但无法加载它。有什么快速解决方法吗?


1
快速修复:将 Map<LocalDateTime, Integer> 更改为 Map<String, Integer>。将 LocalDateTime 保存为字符串,在检索时将其转换为 LocalDateTime - user2004685
2
你可以尝试通过编程方式为此定义一个新的自定义转换器。类似于这样的内容: https://dev59.com/FmYr5IYBdhLWcg3wTYm4 - user2004685
3个回答

7
这解决了问题:
@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);
        }
    }
}

在2023年,您可以覆盖protected void configureConverters(MongoCustomConversions.MongoConverterConfigurationAdapter converterConfigurationAdapter)方法,并通过converterConfigurationAdapter.registerConverter(new MongoDoubleToDateConverter());在其中注册您自定义的转换器。 - takanuva15

0

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

如果您想使用ISODate函数或任何其他JavaScript函数, 您应该查看MongoDB Java驱动程序如何处理它。例如在 ISODate的情况下:

在您的JSON文件中使用 $date 进行转换。

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

0

@Maksym的方法也帮助了我。我不得不对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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接