Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "username&quo

公司开发项目中,出现一个错误,找了一下午,才找到一个类似的错误,现在记录一下。

 

报错信息:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'pd.username != null and pd.username != '''. Cause: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "username")

 

分析原因:

公司开发项目,是用一个项目框架来开发的,其中没有针对每个数据表建立实体类,而是直接创建PageData类型(继承HashMap并实现了Map接口),由此类来代替所有的实体类。

框架使用SSM。

当客户端请求Controller,我会通过new PageData()创建PageData()对象,将前端JSP传到Controller中方法的参数进行保存。由于mapper.xml映射文件中,时常会需要传递输入参数类型和输出参数类型,因此是直接传递PageData类型的参数。但此时在mapper.xml映射文件中不能使用pd.属性名来获取参数了,因此mybatis会直接用它封装的方法,return一个map。如下:

错误写法:

    <select id="findUserByUsername" parameterType="pd" resultType="pd">
        SELECT
            *
        FROM
            user
        <where>
            <if test="pd.username != null and pd.username != ''">
                AND user.username = #{pd.username}
            </if>
        </where>
    </select>

 

正确写法:把pd去掉即可

    <select id="findUserByUsername" parameterType="pd" resultType="pd">
        SELECT
            *
        FROM
            user
        <where>
            <if test="username != null and username != ''">
                AND user.username = #{username}
            </if>
        </where>
    </select>

上一篇:【MyBatis深入剖析】应用分析与最佳实践(下)


下一篇:Redis Sentinel操作