apache.common.dbutils的BeanHandler的“缺陷”?

58 篇文章 0 订阅
22 篇文章 0 订阅

先看一下BUG信息:

异常:
 16:46:57.472 ERROR - DbUtilsExecutor-find:Cannot create com.keydak.gateguard.database.bean.gategd.GateController: com.keydak.gateguard.database.bean.gategd.GateController Query: SELECT * FROM t_gg_gate_controller WHERE controller_id = 
 



apache.common.dbutils利用BeanHandler<T>对JDBC返回的resultSet进行处理,从而获得bean.


BeanHandler<T>利用泛化所有类型的bean都支持处理,内部源码采用了


(该类的功能网上搜索一下可以会的官方的接口文档)

下面这一段是核心部分

/**
 * Factory method that returns a new instance of the given Class.  This
 * is called at the start of the bean creation process and may be
 * overridden to provide custom behavior like returning a cached bean
 * instance.
 * @param <T> The type of object to create
 * @param c The Class to create an object from.
 * @return A newly created object of the Class.
 * @throws SQLException if creation failed.
 */
protected <T> T newInstance(Class<T> c) throws SQLException {
    try {
        return c.newInstance();

    } catch (InstantiationException e) {
        throw new SQLException(
            "Cannot create " + c.getName() + ": " + e.getMessage());

    } catch (IllegalAccessException e) {
        throw new SQLException(
            "Cannot create " + c.getName() + ": " + e.getMessage());
    }
}

可以看到整个泛化过程都依赖于反射技术,也就是说,Bean必须具备有被反射的条件。


我们看到了这一句

c.newInstance();


利用反射调用了无参构造函数,也就是说Bean必须要有无参构造函数。这里如果Bean没有声明无参构造函数就会创建Bean失败了。


解决问题的方法:

Dbutils要用源码包,单步调试可以发现问题。


优化Dbutils的想法:在异常信息进行详细描述。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值