2013-11-21 1 views
2

spring-data-mongodb 버전 1.0.2.RELEASE을 사용하는 기존 문서 컬렉션이 있습니다.기존 spring-data-mongodb 문서 콜렉션에 최종 필드를 추가하는 방법은 무엇입니까?

@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이므로 생성자에서 설정해야합니다. 생성자에 새 속성을 추가하면 응용 프로그램은 더 이상 기존 문서를 읽을 수 없습니다. 내가 수동으로 billable 필드를 포함하는 기존 문서를 업데이트하지 않는

org.springframework.data.mapping.model.MappingInstantiationException: Could not instantiate bean class [com.some.package.Snapshot]: Illegal arguments for constructor; 

는 지금까지 내가 말할 수있는, 당신이 @PersistenceContstructor로 선언 여러 생성자를 가질 수 없습니다 그래서, 나는이 기존 컬렉션에 final 속성을 추가 할 수있는 방법이 없습니다.

아무도 해결책을 찾지 못했습니까?

답변

3

@PersistenceContstructor 특수 효과 만 사용하여 기존 컬렉션에 새로운 private final 필드를 추가 할 수 없음을 발견했습니다. 대신 나를 위해 논리를 처리하기 위해 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); 
    } 
} 

내가이 미래에 다른 사람을 도울 수 있기를 바랍니다.