type-conversion - SpringMongoDB persisting nested field with conversion produces org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for
问题描述
I have a class (Order) with a property(complexAction) whose type I use from another module/dependency. This I can't change and can't persist because of missing constructor. Now I try to replace this field for persistence with an own class, which can be persisted without problems, in a simple way using a customized Spring-MongoDB converter.
Unfortunately now I always get the error
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.example.issue_mongodb.intern.SimpleAction.
I found out that you can create the mapping context somehow by yourself and make this 'SimpleAction' entity known to MongoDB driver in it, but is there an easier way how to do this Spring-like?
Thx for the feedback :-)
@Data
@Builder
@Document
@AllArgsConstructor
@NoArgsConstructor
public class Order {
String id;
//external api dependency, could not be updated
ComplexAction complexAction;
}
@Getter
public class ComplexAction {
String actionName;
LocalDateTime localDateTime;
public ComplexAction(String actionName, Date time) {
this.actionName = actionName;
this.localDateTime = time.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
}
@Data
@Document
public class SimpleActionEntity {
String name;
Date time;
}
@WritingConverter
public class ComplexActionToSimpleActionConverter implements Converter<ComplexAction, SimpleActionEntity> {
@Override
public SimpleActionEntity convert(ComplexAction complexAction) {
SimpleActionEntity simpleActionEntity = new SimpleActionEntity();
simpleActionEntity.setName(complexAction.getActionName());
LocalDateTime localDateTime = complexAction.getLocalDateTime();
simpleActionEntity.setTime(
Date.from(localDateTime.atZone(ZoneId.systemDefault())
.toInstant())
);
return simpleActionEntity;
}
}
@ReadingConverter
public class SimpleActionToComplexActionConverter implements Converter<SimpleActionEntity, ComplexAction> {
@Override
public ComplexAction convert(SimpleActionEntity simpleActionEntity) {
return new ComplexAction(simpleActionEntity.getName(), simpleActionEntity.getTime());
}
}
@Configuration
public class MongoDBConfig {
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(Arrays.asList(
new SimpleActionToComplexActionConverter(),
new ComplexActionToSimpleActionConverter()
));
}
}
解决方案
推荐阅读
- html - Flex 子元素超出父容器元素并溢出滚动
- javascript - 从 aspx.cs CodeBehind 调用 .js 文件中的函数
- python-3.x - 为什么 GSM/GPRS SIM800L 模块在英国不工作
- unity3d - 两个 3d 对象之间的统一旋转
- vue.js - 刷新 vue.js keep-alive 部分中的页面
- php - 如何在 PHP 中将 SOAP 标头和正文作为参数传递
- c# - 如何在两个不同的类上使用相同的 JsonProperty 名称
- c++ - 为什么 *ptr 在 printf 中?
- python-3.5 - 如何使用虚拟环境修复 python3 中 Opencv3 的警告“QObject::moveToThread:”?
- r - 根据另一列更改列值,但仅适用于第一列和第二列 (R) 中的某些条件