2012-02-06 5 views
4

я иметь пружинную @Document object ProfileКак ссылаться GridFSFile с @DbRef аннотацией (весна MongoDB данных)

я хотел бы сослаться GridFSFile, как это:

@DbRef 
private GridFSFile file; 

файл прописан в другую коллекцию тип GridFS.

У меня всегда есть java.lang.StackOverflowError, когда я установил profile.setFile(file);

java.lang.StackOverflowError 
at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:336) 
at org.springframework.data.util.TypeDiscoverer.hashCode(TypeDiscoverer.java:365) 
at org.springframework.data.util.ClassTypeInformation.hashCode(ClassTypeInformation.java:39) 
at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:336) 
at org.springframework.data.util.ParentTypeAwareTypeInformation.hashCode(ParentTypeAwareTypeInformation.java:79) 
at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:336) 

Я не понимаю, если кто-то с идеей ссылки на файл я заинтересован

Спасибо, Xavier

ответ

1

Я хотел что-то подобное, и не нашел пути, поэтому я сделал это обходное решение.

В классе @Document, поставить ObjectId поле

@Document 
public class MyDocument { 
    //...  
    private ObjectId file; 
} 

Затем в хранилище, добавить специальный метод, чтобы связать файл с этим MyDocument после advices from Oliver Gierke и используя GridFsTemplate:

public class MyDocumentRepositoryImpl implements MyDocumentRepositoryCustom { 

    public static final String MONGO_ID = "_id"; 


    @Autowired 
    GridFsTemplate gridFsTemplate; 

    @Override 
    public void linkFileToMyDoc(MyDocument myDocument, InputStream stream, String fileName) { 
     GridFSFile fsFile = gridFsTemplate.store(stream, fileName); 
     myDocument.setFile((ObjectId) fsFile.getId()); 
    } 

    @Override 
    public void unLinkFileToMyDoc(MyDocument myDocument) 
    { 
     ObjectId objectId = myDocument.getFile(); 

     if (null != objectId) { 
      gridFsTemplate.delete(Query.query(Criteria.where(MONGO_ID).is(objectId))); 
      myDocument.setFile(null); 
     } 
    } 
} 

Кстати, вам необходимо объявить GridFsTemplate в вашем JavaConf, чтобы его автообновить

@Bean 
public GridFsTemplate gridFsTemplate() throws Exception { 
    return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter()); 
} 
Смежные вопросы