如何将final字段添加到现有的spring-data-mongodb文档集合中?

时间:2013-11-21 16:38:04

标签: java mongodb spring-data-mongodb

我使用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此现有集合的属性。

之前有没有人找到解决方案?

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);
    }
}

我希望将来可以帮助其他人。