我使用spring-data-mongodb
版本1.0.2.RELEASE
创建了现有文档集。
@Document
public class Snapshot {
@Id
private final long id;
private final String description;
private final boolean active;
@PersistenceConstructor
public Snapshot(long id, String description, boolean active) {
this.id = id;
this.description = description;
this.active = active;
}
}
我正在尝试添加新属性private final boolean billable;
。由于属性为final
,因此需要在构造函数中设置它们。如果我将新属性添加到构造函数中,则应用程序将无法再读取现有文档。
org.springframework.data.mapping.model.MappingInstantiationException: Could not instantiate bean class [com.some.package.Snapshot]: Illegal arguments for constructor;
据我所知,你不能将多个构造函数声明为@PersistenceContstructor
,所以除非我手动更新现有文档以包含billable
字段,否则我无法添加{{1此现有集合的属性。
之前有没有人找到解决方案?
答案 0 :(得分:3)
我发现仅使用private final
注释无法向现有集合添加新的@PersistenceContstructor
字段。相反,我需要添加一个org.springframework.core.convert.converter.Converter
实现来为我处理逻辑。
这是我的转换器最终看起来像:
@ReadingConverter
public class SnapshotReadingConverter implements Converter<DBObject, Snapshot> {
@Override
public Snapshot convert(DBObject source) {
long id = (Long) source.get("_id");
String description = (String) source.get("description");
boolean active = (Boolean) source.get("active");
boolean billable = false;
if (source.get("billable") != null) {
billable = (Boolean) source.get("billable");
}
return new Snapshot(id, description, active, billable);
}
}
我希望将来可以帮助其他人。