MongoDB,Spring Data,findAll()方法错误:
找不到能够将类型 [java.lang.String] 转换为类型 [java.time.LocalDateTime] 的转换器
public class EntityName {
@Id
private String id;
private Map<LocalDateTime, Integer> statistic;
}
我能保存实体,但无法加载它。有什么快速解决方法吗?
MongoDB,Spring Data,findAll()方法错误:
找不到能够将类型 [java.lang.String] 转换为类型 [java.time.LocalDateTime] 的转换器
public class EntityName {
@Id
private String id;
private Map<LocalDateTime, Integer> statistic;
}
我能保存实体,但无法加载它。有什么快速解决方法吗?
@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);
}
}
}
protected void configureConverters(MongoCustomConversions.MongoConverterConfigurationAdapter converterConfigurationAdapter)
方法,并通过converterConfigurationAdapter.registerConverter(new MongoDoubleToDateConverter());
在其中注册您自定义的转换器。 - takanuva15参考 - https://github.com/lordofthejars/nosql-unit#dataset-format
如果您想使用ISODate函数或任何其他JavaScript函数, 您应该查看MongoDB Java驱动程序如何处理它。例如在 ISODate的情况下:
在您的JSON文件中使用 $date 进行转换。
"bornAt":{ "$date" : "2011-01-05T10:09:15.210Z"}
@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);
}
}
Map<LocalDateTime, Integer>
更改为Map<String, Integer>
。将LocalDateTime
保存为字符串,在检索时将其转换为LocalDateTime
。 - user2004685