There is no READABLE property named 'userName' in class 'java.lang.String'

本文探讨了使用iBatis进行模糊查询时遇到的问题,详细分析了一个具体的错误实例,并提供了相应的解决方案。
iBatis做模糊查询时,报如下错误,不知道各位有没遇到过?如何处理?

错误:
com.ibatis.common.beans.ProbeException: There is no READABLE property named 'userName' in class 'java.lang.String'
at com.ibatis.common.beans.ClassInfo.getGetter(ClassInfo.java:259)
at com.ibatis.common.beans.ComplexBeanProbe.getProperty(ComplexBeanProbe.java:304)
at com.ibatis.common.beans.ComplexBeanProbe.getObject(ComplexBeanProbe.java:199)
at com.ibatis.common.beans.GenericProbe.getObject(GenericProbe.java:74)

SQL为:

<!-- 用户名模糊查询 -->
<select id="getUserByName" resultMap="UserResult" parameterClass="String" resultClass="List" cacheModel="user-cache">
select A.userId,
A.userName,
A.companyId,
A.userBH,
A.userPassword,
A.userFunction,
B.companyName,
A.createUser,
A.createDate,
A.updateUser,
A.updateDate
from userTable A left outer join company B on A.companyId=B.companyId
<dynamic prepend="where">
<isNotEmpty prepend="and" property="userName">
userName like '%$userName$%'
</isNotEmpty>
</dynamic>
</select>
是的,从 **Java 17** 开始,`SecurityManager` 被标记为 **`@Deprecated(forRemoval = true)`**,意味着它将在未来的版本中被移除。如果你的代码运行在 **Java 17+** 环境,建议不再依赖 `SecurityManager` 进行权限检查,而应该采用替代方案。 --- ### **替代 `SecurityManager` 的权限检查方法** #### **1. 使用 `Files` 和 `Path` API(推荐)** Java 提供了更现代的 `java.nio.file` API,可以替代 `SecurityManager` 进行权限检查: ```java import java.nio.file.*; Path dirPath = Paths.get("input_json"); try { // 检查是否可读 if (!Files.isReadable(dirPath)) { System.out.println("错误:目录不可读!"); return; } // 检查是否可写 if (!Files.isWritable(dirPath)) { System.out.println("错误:目录不可写!"); return; } } catch (SecurityException e) { System.out.println("权限检查失败:" + e.getMessage()); } ``` **优点**: - 更符合现代 Java 编程规范(NIO 比传统 IO 更高效)。 - 不依赖即将被移除的 `SecurityManager`。 --- #### **2. 直接使用 `File` 的 `canRead()` / `canWrite()`** 如果仍然使用 `File` 类,可以这样检查: ```java File inputDir = new File("input_json"); if (!inputDir.canRead()) { System.out.println("错误:程序没有权限读取该目录!"); return; } if (!inputDir.canWrite()) { System.out.println("错误:程序没有权限写入该目录!"); return; } ``` **适用场景**: - 适合旧代码迁移,改动最小。 --- #### **3. 使用 `AccessController`(仅适用于仍然需要安全管理的情况)** 如果仍然需要类似 `SecurityManager` 的功能(如自定义安全策略),可以使用 `AccessController`: ```java import java.security.AccessController; import java.security.PrivilegedAction; try { AccessController.doPrivileged((PrivilegedAction<Void>) () -> { Files.readAllBytes(Paths.get("input_json/test.txt")); // 尝试读取文件 return null; }); } catch (SecurityException e) { System.out.println("权限不足:" + e.getMessage()); } ``` **适用场景**: - 需要自定义安全策略的遗留系统。 - 在 `SecurityManager` 被移除后,`AccessController` 可能仍然保留(但功能受限)。 --- ### **为什么 Java 废弃 `SecurityManager`?** - **过时**:现代安全模型(如容器、Docker、JVM 沙箱)已经取代了它的功能。 - **性能开销**:`SecurityManager` 会带来额外的运行时检查,影响性能。 - **复杂性**:大多数应用不需要它,反而增加了代码复杂度。 --- ### **总结** | 方法 | 适用场景 | 是否推荐(Java 17+) | |------|---------|----------------| | `Files.isReadable()/isWritable()` | 普通权限检查 | ✅ **推荐** | | `File.canRead()/canWrite()` | 旧代码兼容 | ⚠️ 可用,但不够现代 | | `AccessController` | 需要安全管理 | ❌ 未来可能废弃 | | `SecurityManager` | 旧版 Java | ❌ 已废弃 | **推荐做法**: 1. **迁移到 `java.nio.file` API**(`Files` + `Path`)。 2. 如果遇到权限问题,检查操作系统文件权限或容器(如 Docker)的挂载权限。 --- **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值