我目前正在使用一个使用ZK (https://www.zkoss.org/)框架的web应用程序,它使用的是HotSpot JVM (https://adoptopenjdk.net/?variant=openjdk11&jvmVariant=hotspot)。通过使用这个JVM,ZK可以使用它的EL包反射地访问我的对象(Bean)。当我尝试使用另一个标准-JVM(来自https://adoptopenjdk.net/?variant=openjdk11&jvmVariant=openj9的openj9)运行它时,反射性地访问某些对象的属性会导致异常(参见此消息的结尾)。我想使用这个JVM,因为对于我的应用程序来说,它的内存占用比hotspot要小。
使用的ZK版本为8.6.2 (bind/common)
为什么不同的JVM会导致不同的结果?如果是,我应该如何对其进行故障排除?
在这个特定的案例中,ZK使用Apache Common EL的分支版本,这是一个已停止的项目。(2003)。下面列出了我得到的异常。在这里,框架无法访问有问题的对象(应用程序级对象,而不是java.lang.Long),并且正在调用一个在Long上不存在(但存在于应用程序对象中)的方法。
org.zkoss.zel.PropertyNotFoundException: Property 'visible' not found on type java.lang.Long
at org.zkoss.zel.BeanELResolver$BeanProperties.get(BeanELResolver.java:424) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zel.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:375) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zel.BeanELResolver.property(BeanELResolver.java:547) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zel.BeanELResolver.getValue(BeanELResolver.java:98) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zel.CompositeELResolver.getValue(CompositeELResolver.java:66) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zel.CompositeELResolver.getValue(CompositeELResolver.java:66) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zel.CompositeELResolver.getValue(CompositeELResolver.java:66) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.xel.zel.XelELResolver.getValue(XelELResolver.java:99) ~[zcommon_8.6.2.jar:8.6.2]
at org.zkoss.bind.xel.zel.BindELResolver.getValue(BindELResolver.java:123) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.zel.impl.parser.AstValue.getValue(AstValue.java:188) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zel.impl.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184) ~[zel_8.6.2.jar:8.6.2]
at org.zkoss.zkmax.bind.impl.ValueExpressionImplEx.getValue(ValueExpressionImplEx.java:52) ~[zkmax_8.6.2.jar:8.6.2]
at org.zkoss.xel.zel.ELXelExpression.evaluate(ELXelExpression.java:41) ~[zcommon_8.6.2.jar:8.6.2]
at org.zkoss.zkmax.bind.impl.BindEvaluatorXImplEx$LazyBindXelExpression.evaluate(BindEvaluatorXImplEx.java:124) ~[zkmax_8.6.2.jar:8.6.2]
at org.zkoss.bind.impl.BindEvaluatorXImpl.getValue(BindEvaluatorXImpl.java:46) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.impl.LoadPropertyBindingImpl.load(LoadPropertyBindingImpl.java:58) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.impl.PropertyBindingHandler.doLoadBinding(PropertyBindingHandler.java:140) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.impl.PropertyBindingHandler.doLoad(PropertyBindingHandler.java:341) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.impl.BinderImpl.loadComponentProperties0(BinderImpl.java:2491) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.impl.BinderImpl.loadComponent0(BinderImpl.java:2458) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.impl.BinderImpl.loadComponent(BinderImpl.java:2393) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.tracker.impl.BindUiLifeCycle.reInitBinder0(BindUiLifeCycle.java:170) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.tracker.impl.BindUiLifeCycle.reInitBinder(BindUiLifeCycle.java:109) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.tracker.impl.BindUiLifeCycle.access$100(BindUiLifeCycle.java:55) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.bind.tracker.impl.BindUiLifeCycle$2.onEvent(BindUiLifeCycle.java:100) ~[zkbind_8.6.2.jar:8.6.2]
at org.zkoss.zk.ui.AbstractComponent.onEvent(AbstractComponent.java:3179) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:3127) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:3091) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:138) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.ui.impl.UiEngineImpl.processEvent(UiEngineImpl.java:1845) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.ui.impl.UiEngineImpl.process(UiEngineImpl.java:1617) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.ui.impl.UiEngineImpl.execUpdate(UiEngineImpl.java:1320) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.au.http.DHtmlUpdateServlet.process(DHtmlUpdateServlet.java:611) ~[zk_8.6.2.jar:8.6.2]
at com.castortech.iris.ba.webviewer.internal.ZkUpdateServlet.process(ZkUpdateServlet.java:62) ~[com.castortech.iris.ba.webviewer/:na]
at org.zkoss.zk.au.http.DHtmlUpdateServlet.doGet(DHtmlUpdateServlet.java:487) ~[zk_8.6.2.jar:8.6.2]
at org.zkoss.zk.au.http.DHtmlUpdateServlet.doPost(DHtmlUpdateServlet.java:495) ~[zk_8.6.2.jar:8.6.2]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) ~[javax.servlet_3.1.0.v201410161800.jar:3.1.0]发布于 2020-02-28 09:25:25
很明显这里出了点问题。
为了解决这个问题,一个再现的例子将是最有帮助的。例如,一个简单的zul文件,显示了与简化的ViewModel和所需的Bean类相结合导致此错误的EL表达式。这将极大地提高有人发现问题的机会。
理想情况下,在zkfiddle.org上提供一个可运行的示例(即使它没有显示在那里使用的JVM上的错误-它将有助于在本地计算机上使用您提到的adoptJDK版本测试确切的场景)。
或者如果你不能在公共场合分享任何代码,zkoss提供了专门的customer support。
发布于 2021-07-29 17:47:07
我不知道你能不能解决这个问题。但我也犯过几乎相同的错误。Zk试图从错误的对象获取属性。我想我也有一个非常相似的堆栈,所以可能和你有相同的问题。在很多wtf之后?!经过太长时间的调试,我发现了其中的原因。当两个对象具有相同的散列值时,ZK在集合绑定过程中假定它们是相同的对象。因此,特别是当您在实体上使用自己的hashcode()实现时,就会发生这种情况。
https://stackoverflow.com/questions/59935389
复制相似问题