zk5.0.2中基于注解对象图浏览的bug

zk5.0中基于注解对象图浏览的bug

 

举例:列出用户所在部门的所有员工

 

<listbox model="@{indexWin.user.dept.users}">

    <listitem self="@{each=user}"  label="@{user.name}"

</listbox>

 

这里代码是没有任何问题的

 

但是如果开发人员在Dept类中未提供users的get方法,问题就出来了

 

1,在zk3.6.4中报错如下:

 

 

 

org.zkoss.zk.ui.UiException: java.lang.NoSuchMethodException: class com.xxxxx.xxxxx.web.zk.controller.IndexController: name=users args=null

sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

java.lang.reflect.Constructor.newInstance(Constructor.java:513)

org.zkoss.lang.Classes.newInstance(Classes.java:78)

........................................................................

 

 

 

2,但是在zk.5.xxx.xxx报错如下:

 

 

org.zkoss.zk.ui.UiException: Expects java.util.Set, java.util.List, java.util.Map, Object[], Enum Class, or BindingListModel only. class com.xxxxx.xxxxx.web.zk.controller.IndexController

org.zkoss.zkplus.databind.ListModelConverter.coerceToUi(ListModelConverter.java:57)

org.zkoss.zkplus.databind.Binding.myLoadAttribute(Binding.java:366)

org.zkoss.zkplus.databind.Binding.loadAttribute(Binding.java:336)

org.zkoss.zkplus.databind.DataBinder.loadAttrs(DataBinder.java:572)

 

 

zk3.6.4的异常时正确的,因为由于开发人员的疏忽,忘记写getUsers方法,报 java.lang.NoSuchMethodException异常正确反映了当前错误

 

 

但是zk.5.xx.xx呢,

 

报道异常却是org.zkoss.zk.ui.UiException: Expects java.util.Set, java.util.List, java.util.Map, Object[], Enum Class, or BindingListModel only

 

下面重点讲述一下为什么?

 

 

首先看一下<listbox model="@{indexWin.user.dept.users}">

    <listitem self="@{each=user}"  label="@{user.name}"

</listbox>

 

 

  • 在zk3.6.4中,它是这么解析的:首先找到indexWin组件,再从indexWin组件内查找getUser方法

 

 

然后从返回的user对象中,找getDept方法,最后从dept对象中查找getUsers方法

 

 

在查找的过程中,如果未找到,立即报错,报无匹配get方法错误

 

 

 

 

  • 在zk5.xxx.xxx中,首先找到indexWin组件,再从indexWin组件内查找getUser方法

     

     

    然后从返回的user对象中,找getDept方法,最后从dept对象中查找getUsers方法

     

     

    但与3.6.4不同的是:在查找的过程中,如果未找到get方法,zk5则返回上一个找到的对象

     

    举个例子:

    1,如在dept类中未提供getUsers方法,@{indexWin.user.dept.users}返回dept对象

    2,如在user类中未提供getDept方法,@{indexWin.user.dept.users}返回user对象

    3,如在indexWin类中未提供getUser方法,@{indexWin.user.dept.users}返回indexWin对象

     

     

     

再回过头来,看开始部分举得例子

<listbox model="@{indexWin.user.dept.users}">

 

    <listitem self="@{each=user}"  label="@{user.name}"

</listbox>

 

 

由于未提供getUsers方法,@{indexWin.user.dept.users}返回的结果为dept对象,但是listbox model属性接受的类型仅为 java.util.Set, java.util.List, java.util.Map, Object[], Enum Class, or BindingListModel ,因此在类型转换的时候报错

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值