Bean实体的不规范写法,所导致的奇葩SQLException

解决DBCP数据源异常问题
本文探讨了在使用DBCP数据源时遇到的异常问题,重点分析了实体Bean构造方法缺失导致的问题,并通过实现无参数构造方法解决了该问题。

我们在使用DBCP作为数据源(由Apache开发的),使用Apache下的开源数据源,利用DBCPUtil工具操作数据源,对数据进行增删改查。

我们会常常遇到这种问题:

二月 18, 2016 1:49:43 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [com.xbmu.android.ShowOrderExamServlet] in context with path [/DriverHelperServer] threw exception
java.lang.RuntimeException: java.sql.SQLException: Cannot create com.xbmu.bean.OrderExam: com.xbmu.bean.OrderExam Query: select * from t_orderexam where student_id=? Parameters: [p10001]
at com.xbmu.dao.impl.OrderExamDaoImpl.findOrderExamByStuId(OrderExamDaoImpl.java:50)
at com.xbmu.service.impl.OrderExamServiceImpl.findOrderExamByStuId(OrderExamServiceImpl.java:23)
at com.xbmu.android.ShowOrderExamServlet.showOrderExam(ShowOrderExamServlet.java:42)
at com.xbmu.android.ShowOrderExamServlet.doGet(ShowOrderExamServlet.java:33)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.xbmu.filter.SetAllCharacterEncodingFilter.doFilter(SetAllCharacterEncodingFilter.java:41)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.sql.SQLException: Cannot create com.xbmu.bean.OrderExam: com.xbmu.bean.OrderExam Query: select * from t_orderexam where student_id=? Parameters: [p10001]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:320)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:349)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:287)
at com.xbmu.dao.impl.OrderExamDaoImpl.findOrderExamByStuId(OrderExamDaoImpl.java:47)
... 29 more

我们观察所写的代码:


根据异常的提示,是47行报错,但是我们观察sql语句一点问题都没有,因此,我们推断到实体Bean,也就是OrderExam的问题。

最后仔细观察,原来没有重写OrderExam实体Bean的无参数构造方法。当我重写了无参数的构造方法后,这种异常被就解决了。


仔细想想,OrderExam orderExam = qr.query(sql, new BeanHandler<OrderExam>(OrderExam.class), sid);这条语句将从数据库查询的语句通过反射机制映射成实体Bean。

OrderExam.class创建对象时,应该是调用了无参数的构造方法。因此实体Bean中必须写这个无参数构造方法。















### Java 中 `SQLException` 类未找到符号的解决方案 在 Java 编程中,遇到“找到符号类 `SQLException`”的问题通常是由于项目配置或依赖管理出现了某些问题。以下是可能的原因以及对应的解决办法: #### 1. **缺少必要的 JDBC 驱动** 如果程序中使用了数据库操作而没有引入相应的 JDBC 驱动库,则可能会导致无法识别 `java.sql.SQLException` 这一标准异常类。这是因为 `SQLException` 是 JDK 的一部分,但如果项目的构建工具(如 Maven 或 Gradle)未能正确加载基础库,也可能引发该问题。 解决方案是在项目的依赖管理文件中确认已包含以下内容: 对于 Maven 用户,在 `pom.xml` 文件中加入如下片段[^4]: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> ``` 对于 Gradle 用户,在 `build.gradle` 文件中添加: ```gradle implementation 'mysql:mysql-connector-java:8.0.30' ``` #### 2. **JDK 版本兼容性问题** 确认当前使用的 JDK 是否支持所涉及的功能模块。虽然 `SQLException` 属于核心 API 并且自早期版本就存在,但在极少数情况下,特定环境下的 JDK 实现可能存在差异或者被裁剪掉部分功能。因此建议升级至最新稳定版 JDK 来规避潜在风险。 #### 3. **IDE 设置当** 开发环境中如果没有正确设置源路径或目标平台,同样会造成编译器误判缺失必要组件的情况。例如 Eclipse/IntelliJ IDEA 等 IDE 可能因为项目 SDK 路径错误而导致此类现象发生。 - 在 IntelliJ IDEA 上右键点击项目 -> Module Settings -> Project Structure 下验证是否选择了合适的 JRE/JDK; - 同样检查 Modules->Dependencies Tab ,保证有指向 rt.jar (对于旧版) 或 modules/java.base (新版). #### 4. **拼写错误或其他语法问题** 检查代码本身是否存在简单的打字失误比如大小写的混淆(`sqlexception vs SQLException`)或者是多余的字符干扰正常解析过程. ```java try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println("Driver not found!"); } // 此处故意制造一个假象来展示排查思路 catch(SQLExeption ex){ // 错误示范:应为 SQLException System.err.print(ex.getMessage()); } ``` 以上情况均需仔细核对并修正相应位置才能恢复正常运行状态。 --- ### 总结 通过上述分析可以发现,“找到符号类 `SQLException`”的主要原因集中在外部资源链接足、开发套件适配佳这两个方面。按照指导逐一排除即可有效解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上善若水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值