如何使用@DbRef注释引用GridFSFile(spring data mongodb)

发布于 2025-01-03 18:04:57 字数 901 浏览 0 评论 0原文

我有一个 spring @Document object Profile

我想像它一样引用 GridFSFile :

@DbRef
private GridFSFile file;

该文件被写入另一个集合类型 GridFS 中。

当我设置 profile.setFile(file); 时,我总是遇到 java.lang.StackOverflowError

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)

我不明白,如果有人有想法引用我的文件有兴趣

谢谢, 泽维尔

i have a spring @Document object Profile

i would like to reference GridFSFile like it :

@DbRef
private GridFSFile file;

the file is writen into another collection type GridFS.

I always have a java.lang.StackOverflowError when i set 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)

I do not understand, if someone with an idea to reference a file I'm interested

Thanks,
Xavier

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

看春风乍起 2025-01-10 18:04:57

我想要类似的东西,但没有找到方法,所以我做了这个解决方法。

在您的 @Document 类中,放置一个 ObjectId 字段

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

然后在您的存储库中,添加自定义方法以将文件链接到此 MyDocument,遵循 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());
}

I wanted something similar, and didn't find a way, so I made this workaround.

In your @Document class, put a ObjectId field

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

Then in your Repository, add custom method to link file to this MyDocument, following advices from Oliver Gierke and using a 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);
        }
    }
}

By the way, you'll need to declare your GridFsTemplate in your JavaConf to autowire it

@Bean
public GridFsTemplate gridFsTemplate() throws Exception {
    return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文