Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 在iOS上卸载页面时在Omnifaces@ViewScoped bean上调用@PreDestroy_Jsf_Omnifaces - Fatal编程技术网

Jsf 在iOS上卸载页面时在Omnifaces@ViewScoped bean上调用@PreDestroy

Jsf 在iOS上卸载页面时在Omnifaces@ViewScoped bean上调用@PreDestroy,jsf,omnifaces,Jsf,Omnifaces,我正在Tomcat9容器中使用JSF2.3.9(Mojarra)和OmniFaces3.4开发一个web应用程序。在一个页面上,我显示了来自org.omnifaces.cdi.ViewScopedbean的信息。此bean正在@PostConstruct中分配资源,并且应在用户通过调用@PreDestroy方法导航到其他页面时立即释放这些资源 这在OsX上的Safari、Firefox和Chrome等浏览器上运行良好。但是当在iOS上从Safari启动web应用程序时,不会调用@PreDestr

我正在Tomcat9容器中使用JSF2.3.9(Mojarra)和OmniFaces3.4开发一个web应用程序。在一个页面上,我显示了来自
org.omnifaces.cdi.ViewScoped
bean的信息。此bean正在
@PostConstruct
中分配资源,并且应在用户通过调用
@PreDestroy
方法导航到其他页面时立即释放这些资源

这在OsX上的Safari、Firefox和Chrome等浏览器上运行良好。但是当在iOS上从Safari启动web应用程序时,不会调用
@PreDestroy
方法,例如当页面离开时。 在我看来,之所以会发生这种情况,是因为正如我所看到的那样,Omnifaces的脚本
unload.js
绑定到了这个事件

忘了提及-它是最新的iOS版本13.2.3


有人知道如何解决这个问题吗?

从技术上讲,这是一个全方位的错误。它实际上从未考虑过<代码>预卸载< /代码>还是<代码>卸载< /COD>事件实际上是被支持的。它也从未检查
pagehide
事件

它在OmniFaces 3.4.1(和2.7.3)中报告并已修复

基本上,检查是从

var unloadEvent = window.onbeforeunload ? "unload" : "beforeunload";


它将首先检查
pagehide
是否通过在窗口
中测试
“onpagehide”得到了实际支持,如果不支持,则在卸载前对
执行同样的操作,同时检查是否没有(遗留)自定义处理程序,否则返回到
unload

我认为不应该严格依赖于调用的析构函数。你为什么需要清理?如果用户打开了多个选项卡或者只是关闭了他们的浏览器怎么办?从技术上讲,这是OmniFaces中的一个bug。@Selaron我完全同意你关于释放资源时依赖析构函数的观点。但我需要这种清理,因为ViewScope服务器Bean将数据从网络设备流到JavaScript客户端实现。当用户离开页面时,bean应该关闭资源。由于bean是ViewScope的,所以多个选项卡是没有问题的。我在OmniFaces中创建了这个问题。您可以试试3.4.1-SNAPSHOT看看它是否适合您吗?
var unloadEvent = ("onpagehide" in window) ? "pagehide"
    : ("onbeforeunload" in window && !window.onbeforeunload) ? "beforeunload" : "unload";