我根据这里的示例编写了一个非常简单的应用程序。
当我尝试使用独立的Jetty 9.2.10.v20150310(与GAE托管虚拟机使用的版本相同)运行它时,它运行良好(加载和保存)。当我尝试使用Google Cloud SDK maven插件运行它时,或者当我将它部署到App Engine时,电子表格内容会加载,但CSS无法下载,服务器上出现异常:
[INFO] SEVERE: Failed to load media, /view/z_obs/lGAQ1/f14/0/ss_lGAQ1_t0_sheet_0.css
[INFO] java.lang.NullPointerException
[INFO] at org.zkoss.zss.ui.Spreadsheet.getMergeMatrixHelper(Spreadsheet.java:2755)
[INFO] at org.zkoss.zss.ui.Spreadsheet.prepareBasicStyleSheet(Spreadsheet.java:4144)
[INFO] at org.zkoss.zss.ui.Spreadsheet.getSheetDefaultRules0(Spreadsheet.java:4603)
[INFO] at org.zkoss.zss.ui.Spreadsheet.getSheetDefaultRules(Spreadsheet.java:4597)
[INFO] at org.zkoss.zss.ui.Spreadsheet.access$6200(Spreadsheet.java:219)
[INFO] at org.zkoss.zss.ui.Spreadsheet$ExtraCtrl.getMedia(Spreadsheet.java:3041)
[INFO] at org.zkoss.zk.au.http.AuDynaMediar.service(AuDynaMediar.java:128)
然后UI变得有点混乱——单元格选择高亮显示的长度不正确,尝试键入或格式化单元格内容失败。我尝试了各种组合-ZUL和JSP,在JSP中使用src属性、bookProvider属性和SelectorComposer设置电子表格,有时上面提到的CSS下载得很好,没有异常,或者异常稍后出现,但在所有情况下,每当我对单元格进行更改时,它们都会立即恢复,或者在尝试键入一个单元格后,我无法键入任何内容。从记录的异常中,我认为当前书籍在操作过程中是空的,例如:
[INFO] java.lang.NullPointerException
[INFO] at org.zkoss.zss.ui.au.in.FetchActiveRangeCommand.process(FetchActiveRangeCommand.java:57)
和
[INFO] java.lang.NullPointerException
[INFO] at org.zkoss.zss.ui.au.in.AbstractCommand.getSheetUuid(AbstractCommand.java:37)
[INFO] at org.zkoss.zss.ui.au.in.CellFocusedCommand.process(CellFocusedCommand.java:55)
我按照这里的说明使应用程序对GAE更友好,但除了会话序列化之外,我认为托管虚拟机中不需要这些设置,它们也没有什么不同。
从它在同一版本的standalong Jetty上工作的事实来看,我认为可以假设是AppEngine/Docker在某种程度上造成了这种情况。我可以用旧的GAE SDK在本地运行它,它使用了一个经过修改的Jetty 6,但它不能模拟生产环境。我不能部署到经典的GAE,因为ZKSpreadsheet依赖于java.awt.*类。
我尝试使用默认的Java运行时,也尝试使用基于gcr.io/google_appengine/jetty9、gcr.io-google_aappengine/Java-compat和gcr.io.google_appngine/jetty9-compat的自定义运行时,这似乎无关紧要。
我想我可以尝试基于独立Jetty(或任何应用程序服务器)的第三方Docker镜像,只是为了让它正常工作,但我确实需要访问数据存储和blobstore。
如有任何帮助,我们将不胜感激。
我在github项目中提交了一个错误,应该可以解决这个问题:https://github.com/GoogleCloudPlatform/appengine-java-vm-runtime/issues/151