启用多租户功能后,如何实现文件在多个租户之间共享

1、启用了多租户模块
2、然后有部分基础数据是多个租户共用的,这部分实体没有继承StandardTenantEntity
3、这部分实体里使用了FileDescriptor类型的文件字段
4、在其中一个租户下编辑这个实体的文件字段后,保存到sys_file表里就带了租户id
5、最后在其他租户下就不可以访问这个文件了

你好,我看了看源码,租户Id目前是写在了 FileDescriptor 这个实体中,不是很好处理。但是有个思路,你可以试试:

  1. 扩展 FileDescriptor 实体,假设名为 CustomFileDescriptor,添加一个字段 isShare 表示是否为共享文件。默认为 false
  2. 扩展 TenantEntityPersistingListener 这个bean,重写 beforePersist(),判断条件新加一部分:如果实体是 CustomFileDescriptor 的实例,那么要求 !isShare 时才写入tenantId。
  3. 在写共用数据的文件字段时,将 isShare 设置成 false

这样sys_file里sys_tenant_id为空,会导致所有租户都访问不了这个文件

噢,是的。那判断这种类型的 FileDecriptor 之后,把 tenantId 写为 TenantProvider.NO_TENANT

HasTenantAdditionalCriteriaProvidergetAdditionalCriteria() 方法看,应该写成 NO_TENANT

按你说的把sys_tenant_id写成no_tenant后,文件还是读取不了

我看到了 Bug in multitenancy queries ? tenant_id = "no_tenant" is applied incorrectly - #11 by tom.monnier - CUBA.Platform 这个帖子,NO_TENANT 与我理解的不一样,是专门为超级用户(没有租户的用户)服务的。

也就是说,FileDescriptor 既然带了tenantId,那么只有两种情况:超级用户可见;租户内的用户可以看到自己租户内的文件。租户内的用户想看到超级用户能看到的文件是不支持的。

你的这种场景,我感觉只能自己修改 HasTenantAdditionalCriteriaProvider 里面的 getAdditionalCriteria() 方法,根据你的实际需要生成jpql。

修改了 HasTenantAdditionalCriteriaProvider 里面的 getAdditionalCriteria() 方法后,在页面点下载文件时报错
image

能发一下错误堆栈吗,图看不全。

09:59:12.057 ERROR c.h.cuba.core.sys.ServiceInterceptor    - Exception: 
com.haulmont.cuba.core.global.FileStorageException: File not found: file.log
	at com.haulmont.cuba.core.sys.remoting.LocalFileExchangeServiceBean.downloadFile(LocalFileExchangeServiceBean.java:50) ~[cuba-core-7.2.13.jar:7.2.13]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_345]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_345]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_345]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_345]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:90) ~[cuba-core-7.2.13.jar:7.2.13]
	at sun.reflect.GeneratedMethodAccessor253.invoke(Unknown Source) ~[na:na]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_345]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_345]
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) [spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at com.sun.proxy.$Proxy325.downloadFile(Unknown Source) [na:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_345]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_345]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_345]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_345]
	at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) [cuba-core-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:159) [cuba-web-7.2.13.jar:7.2.13]
	at com.sun.proxy.$Proxy58.downloadFile(Unknown Source) [na:na]
	at com.haulmont.cuba.client.sys.FileLoaderClientImpl.openStreamLocally(FileLoaderClientImpl.java:192) [cuba-client-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.client.sys.FileLoaderClientImpl.openStream(FileLoaderClientImpl.java:99) [cuba-client-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.gui.export.FileDataProvider.provide(FileDataProvider.java:46) [cuba-gui-7.2.13.jar:7.2.13]
	at com.vaadin.server.StreamResource.getStream(StreamResource.java:143) ~[vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.haulmont.cuba.web.widgets.CubaFileDownloader.handleConnectorRequest(CubaFileDownloader.java:115) ~[cuba-web-widgets-7.2.13.jar:na]
	at com.vaadin.server.ConnectorResourceHandler.handleRequest(ConnectorResourceHandler.java:88) ~[vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1578) ~[vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.2.13.jar:7.2.13]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[servlet-api.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) ~[cuba-web-7.2.13.jar:7.2.13]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[catalina.jar:9.0.38]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[catalina.jar:9.0.38]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[catalina.jar:9.0.38]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[catalina.jar:9.0.38]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[catalina.jar:9.0.38]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-coyote.jar:9.0.38]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-coyote.jar:9.0.38]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-coyote.jar:9.0.38]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) ~[tomcat-coyote.jar:9.0.38]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:9.0.38]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_345]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_345]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:9.0.38]
	at java.lang.Thread.run(Thread.java:750) ~[na:1.8.0_345]
Caused by: com.haulmont.cuba.core.global.EntityAccessException: Unable to load entity sys$FileDescriptor-04eea313-e5e2-26f5-e315-2df167f6de2c because it has been deleted or access denied
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:118) ~[cuba-core-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:103) ~[cuba-core-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:98) ~[cuba-core-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:93) ~[cuba-core-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.core.sys.remoting.LocalFileExchangeServiceBean.downloadFile(LocalFileExchangeServiceBean.java:48) ~[cuba-core-7.2.13.jar:7.2.13]
	... 65 common frames omitted
09:59:12.075 ERROR com.haulmont.cuba.web.log.AppLog        - Exception in com.haulmont.cuba.web.AppUI: 
com.haulmont.cuba.core.global.RuntimeFileStorageException: com.haulmont.cuba.core.global.FileStorageException: File not found: file.log
	at com.haulmont.cuba.gui.export.FileDataProvider.provide(FileDataProvider.java:48) ~[cuba-gui-7.2.13.jar:7.2.13]
	at com.vaadin.server.StreamResource.getStream(StreamResource.java:143) ~[vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.haulmont.cuba.web.widgets.CubaFileDownloader.handleConnectorRequest(CubaFileDownloader.java:115) ~[cuba-web-widgets-7.2.13.jar:na]
	at com.vaadin.server.ConnectorResourceHandler.handleRequest(ConnectorResourceHandler.java:88) ~[vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1578) [vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) [vaadin-server-8.9.2-19-cuba.jar:8.9.2-19-cuba]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) [cuba-web-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) [cuba-web-7.2.13.jar:7.2.13]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [servlet-api.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.38]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-websocket.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.38]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) [spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) [spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) [cuba-web-7.2.13.jar:7.2.13]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [catalina.jar:9.0.38]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [catalina.jar:9.0.38]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.38]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) [catalina.jar:9.0.38]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [catalina.jar:9.0.38]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.38]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-coyote.jar:9.0.38]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-coyote.jar:9.0.38]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-coyote.jar:9.0.38]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-coyote.jar:9.0.38]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.38]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_345]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_345]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.38]
	at java.lang.Thread.run(Thread.java:750) [na:1.8.0_345]
Caused by: com.haulmont.cuba.core.global.FileStorageException: File not found: file.log
	at com.haulmont.cuba.core.sys.remoting.LocalFileExchangeServiceBean.downloadFile(LocalFileExchangeServiceBean.java:50) ~[na:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_345]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_345]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_345]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_345]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:90) ~[na:na]
	at sun.reflect.GeneratedMethodAccessor253.invoke(Unknown Source) ~[na:na]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_345]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_345]
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at com.sun.proxy.$Proxy325.downloadFile(Unknown Source) ~[na:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_345]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_345]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_345]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_345]
	at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94) ~[na:na]
	at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:159) ~[cuba-web-7.2.13.jar:7.2.13]
	at com.sun.proxy.$Proxy58.downloadFile(Unknown Source) ~[na:na]
	at com.haulmont.cuba.client.sys.FileLoaderClientImpl.openStreamLocally(FileLoaderClientImpl.java:192) ~[cuba-client-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.client.sys.FileLoaderClientImpl.openStream(FileLoaderClientImpl.java:99) ~[cuba-client-7.2.13.jar:7.2.13]
	at com.haulmont.cuba.gui.export.FileDataProvider.provide(FileDataProvider.java:46) ~[cuba-gui-7.2.13.jar:7.2.13]
	... 35 common frames omitted
Caused by: com.haulmont.cuba.core.global.EntityAccessException: Unable to load entity sys$FileDescriptor-04eea313-e5e2-26f5-e315-2df167f6de2c because it has been deleted or access denied
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:118) ~[na:na]
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:103) ~[na:na]
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:98) ~[na:na]
	at com.haulmont.cuba.core.app.DataManagerBean.reload(DataManagerBean.java:93) ~[na:na]
	at com.haulmont.cuba.core.sys.remoting.LocalFileExchangeServiceBean.downloadFile(LocalFileExchangeServiceBean.java:48) ~[na:na]
	... 65 common frames omitted

DataManager 加载不到这个实体。确认这个实体存在吗?

能加一下日志,看看这个加载的sql是怎样的?