ognl.OgnlContext cannot be cast to java.lang.String错误!可能的原因之一:jsp页面中包含和Struts2中的Context关键字重复从而产生冲突,修

本文介绍了一个博客系统中遇到的问题,由于定义了Context字段导致Struts2框架发生冲突并报错。文章提供了错误截图及冲突代码,并探讨了解决这一问题的方法。
最近在做一个博客系统,博客文章对象中的内容定义了Context字段,因为使用的SSH(Struts+Hibernate+Spring)框架做的,就遇到了这个错误,网上查找一些说法也是大概因为定义了“Context”造成了Strust2的冲突,就会报错,其中OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

出现这种错误就先查找是否是产生了这种冲突,当然也可能是其他原因。这是报错的截图:

这里写图片描述
这是产生冲突的代码:

<td><s:property value="bname" />
                </td>
                <td><s:property value="context" />
                </td>
`org.apache.ibatis.ognl.MethodFailedException: Method "compareTo" failed for object 0.9500 [java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigDecimal]` 这个异常表明在 MyBatis 使用 OGNL 表达式时,尝试将 `java.lang.Integer` 类型的对象强制转换为 `java.math.BigDecimal` 类型,从而导致 `ClassCastException`。以下是可能的解决方法: ### 1. 检查参数类型 确保传入 MyBatis SQL 语句的参数类型与 SQL 中使用的类型一致。如果在 SQL 中使用了 `BigDecimal` 类型进行比较,那么传入的参数也应该是 `BigDecimal` 类型。 示例代码: ```java import java.math.BigDecimal; // 假设这里是调用 MyBatis Mapper 的方法 BigDecimal value = new BigDecimal("0.9500"); // mapper 是 MyBatis 的 Mapper 接口实例 mapper.selectByValue(value); ``` ### 2. 改 SQL 表达式 如果无法保证传入参数的类型,可以在 SQL 中进行类型转换。例如,在 MySQL 中可以使用 `CAST` 函数进行类型转换。 示例 SQL: ```xml <select id="selectByValue" resultMap="ResultMap"> SELECT * FROM your_table WHERE CAST(column_name AS DECIMAL(10, 4)) > #{value} </select> ``` ### 3. 调整 OGNL 表达式 在 MyBatis 的 XML 文件中,可以在 OGNL 表达式中进行类型转换。 示例: ```xml <if test="value != null and value instanceof java.lang.Integer"> <!-- 将 Integer 类型的参数转换为 BigDecimal --> <bind name="bigDecimalValue" value="new java.math.BigDecimal(value.toString())"/> <!-- 使用转换后的 BigDecimal 进行比较 --> AND column_name > #{bigDecimalValue} </if> <if test="value != null and value instanceof java.math.BigDecimal"> AND column_name > #{value} </if> ``` ### 4. 检查数据来源 确保从数据源获取的数据类型是正确的。如果数据是从数据库查询得到的,要确保数据库表中字段的类型与 Java 代码中使用的类型一致。 ### 5. 异常处理日志记录 在代码中添加异常处理日志记录,以便更好地定位问题。 示例代码: ```java import java.math.BigDecimal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class YourService { private static final Logger logger = LoggerFactory.getLogger(YourService.class); public void doSomething() { try { BigDecimal value = new BigDecimal("0.9500"); // mapper 是 MyBatis 的 Mapper 接口实例 mapper.selectByValue(value); } catch (Exception e) { logger.error("Error occurred while executing MyBatis query", e); // 可以根据具体情况进行异常处理 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Phoenix_smf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值