我有一个spring@documentobject Profile
我想引用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)
我不明白,如果有人想引用我感兴趣的文件
谢谢,
沙维尔
最佳答案
我想要类似的东西,却找不到办法,所以我做了个变通办法。
在@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);
}
}
}
顺便说一下,您需要在javaconf中声明
GridFsTemplate
来自动连接它@Bean
public GridFsTemplate gridFsTemplate() throws Exception {
return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
}