Multiple markers at this line - The type org.springframework.dao.DataAccessException cannot be

本文分享了在使用Spring框架的JdbcTemplate时遇到DataAccessException错误的解决方案。通过检查并引入缺失的spring-tx依赖,成功解决了JdbcTemplate更新方法中引用类型未解析的问题。

今天测试使用JdbcTemplate,报错,报错内容如下:

Multiple markers at this line

      - The type org.springframework.dao.DataAccessException cannot be resolved. It is indirectly referenced from

       required .class files

      - The method update(String) from the type JdbcTemplate refers to the missing type DataAccessException

 

最开始以为是jre版本过高了,改成1.6还是同样的问题,后来发现是有一个包spring-tx-4.1.5.RELEASE.jar,没有放到lib里面,下载粘贴进去,build to path错误就消失了

 

 

你遇到的错误: ``` Multiple markers at this line - The type org.eclipse.core.runtime.IProgressMonitor cannot be resolved. It is indirectly referenced from required .class files - This lambda expression refers to the missing type IProgressMonitor ``` ### ❌ 错误原因: 你的项目 **缺少 `org.eclipse.core.runtime` 插件依赖**,而 `IProgressMonitor` 接口正是定义在这个插件中。虽然你在代码里用了 `ProgressMonitorDialog` 和 `IRunnableWithProgress`,但 JVM 在编译时找不到 `IProgressMonitor` 类型,因此无法解析 lambda 表达式中的参数类型。 这个是典型的 Eclipse 插件开发(即 RCP 或 Plugin 项目)中 **OSGi bundle 依赖未正确声明** 的问题。 --- ## ✅ 解决方案:添加必要的插件依赖 你需要确保以下两个条件满足: ### ✅ 步骤 1:检查并添加 `org.eclipse.core.runtime` 到依赖中 #### 如果你是使用 **Eclipse Plug-in Project(MANIFEST.MF 方式)** 1. 打开项目的 `META-INF/MANIFEST.MF` 文件。 2. 切换到 **"Dependencies"** 标签页。 3. 在 **"Imported Packages"** 区域点击 “Add…”。 4. 搜索并添加如下包: - `org.eclipse.core.runtime` - `org.eclipse.core.runtime.jobs`(可选,用于 Job 相关) - `org.eclipse.jface.operation` - `org.eclipse.swt` - `org.eclipse.ui` > ⚠️ 最关键的是要包含: > - `org.eclipse.core.runtime` → 提供 `IProgressMonitor` > - `org.eclipse.jface.dialogs` → 提供 `ProgressMonitorDialog` 5. 保存文件。 > 💡 或者你可以直接编辑 `MANIFEST.MF` 文件,在 `Import-Package` 中手动加入: ```text Import-Package: org.eclipse.core.runtime, org.eclipse.jface.dialogs, org.eclipse.swt.widgets, org.eclipse.ui, org.eclipse.ui.handlers ``` --- ### ✅ 步骤 2:确认类路径中有对应的库(适用于非插件项目) 如果你不是在写一个真正的 Eclipse 插件,而是普通 Java 项目中尝试运行这段代码,那你需要手动将以下 JAR 添加到构建路径中: | JAR 文件 | 作用 | |--------|------| | `org.eclipse.core.runtime_<version>.jar` | 包含 `IProgressMonitor` 等核心接口 | | `org.eclipse.jface_<version>.jar` | 包含 `ProgressMonitorDialog` | | `org.eclipse.swt.<platform>_<version>.jar` | SWT 支持 | | `org.eclipse.ui.workbench_<version>.jar` | 提供 Workbench 相关类 | 这些 JAR 通常位于你的 Eclipse 安装目录下的 `plugins/` 文件夹中,例如: ``` eclipse/plugins/org.eclipse.core.runtime_*.jar eclipse/plugins/org.eclipse.jface_*.jar ``` 👉 右键项目 → Build Path → Add External Archives → 选择上述 JAR。 --- ### ✅ 步骤 3:清理并重建项目 - 菜单栏:Project → Clean → Clean all projects - 然后重新构建项目 这会触发完整的编译流程,让编译器能找到之前缺失的类型。 --- ## ✅ 验证修复结果 当你完成以上步骤后,原来的错误应该消失,lambda 写法也能正常工作: ```java progressMonitorDialog.run(true, false, monitor -> { ... }); ``` 因为现在编译器可以正确解析 `monitor` 参数为 `IProgressMonitor` 类型了。 --- ## 🔁 替代方案:避免 Lambda(临时绕过问题) 如果暂时不想处理依赖问题,也可以不用 Lambda,改用匿名内部类方式(等效): ```java progressMonitorDialog.run(true, false, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("正在执行操作...", 100); try { for (int i = 0; i <= 100; i += 5) { Thread.sleep(100); if (monitor.isCanceled()) { throw new InterruptedException("任务被取消"); } monitor.worked(5); monitor.subTask("已完成 " + i + "%"); } Display.getDefault().asyncExec(() -> { MessageDialog.openInformation(window.getShell(), "完成", "操作已完成!"); }); } finally { monitor.done(); } } }); ``` 这种方式对类型推导要求较低,更容易暴露具体缺哪个包。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值