org.apache.ibatis.ognl.OgnlException
org.apache.ibatis.ognl.OgnlException异常出在mybatis框架执行动态SQL时的场景,常见的情况是mapper接口的对象参数为空,或是mapper接口参数对象没有指定的属性,构建测试代码和数据
一 测试数据
CREATE TABLE `book` (`id` int NOT NULL,`book_name` varchar(32) DEFAULT NULL,`book_type` varchar(32) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
二 测试代码
@PostMapping("/queryBookListOne")
public List<Book> queryBookListOne(@RequestBody BookReq bookReq) {return bookService.queryBookListOne(bookReq);
}
public interface IBookService extends IService<Book> {List<Book> queryBookListOne(BookReq bookReq);
}@Service
public class BookServiceImpl extends ServiceImpl<BootBookMapper, Book> implements IBookService {@Autowiredprivate BootBookMapper bookMapper;@Overridepublic List<Book> queryBookListOne(BookReq bookReq) {return bookMapper.queryBookListOne(bookReq);}}
@Mapper
public interface BootBookMapper extends BaseMapper<Book> {List<Book> queryBookListOne(@Param("bookReq") BookReq bookReq);
}<select id="queryBookListOne" resultType="com.unique.domain.Book">select * from bookwhere 1=1<if test="bookReq.bookType != null and bookReq.bookType != null">and book_type = #{bookReq.bookType}</if>
</select>
@TableName("book")
public class Book {private Integer id;private String bookName;private String bookType;
}@Data
public class BookReq {private String bookName;
}2.1 mapper接口参数对象没有指定的属性
在动态SQL的if标签中有判断BookReq类的bookType属性,但是在BookReq类中却没有bookType属性,那么就会报org.apache.ibatis.ognl.OgnlException异常
org.apache.ibatis.ognl.NoSuchPropertyException: com.unique.vo.BookReq.bookTypeat org.apache.ibatis.ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:164) ~[mybatis-3.5.7.jar:3.5.7]at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:3373) ~[mybatis-3.5.7.jar:3.5.7]在BookReq类中加上bookType属性,则接口就会调用正常
@Data
public class BookReq {private String bookName;private String bookType;
}2.2 mapper接口调用参数为空
@Override
public List<Book> queryBookListOne(BookReq bookReq) {return bookMapper.queryBookListOne(null);
}
org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "bookType")at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:3366) ~[mybatis-3.5.7.jar:3.5.7]在调用mapper接口时,传入的参数是null值就会报org.apache.ibatis.ognl.OgnlException,可以根据业务逻辑,适当的再加上mapper接口参数对象不等于空的校验
<select id="queryBookListOne" resultType="com.unique.domain.Book">select * from bookwhere 1=1<if test="bookReq != null and bookReq.bookType != null and bookReq.bookType != null">and book_type = #{bookReq.bookType}</if>
</select>2.3 小结
在业务代码中,完善非空校验,并且确保mapper接口参数和动态SQL中使用到的属性保持一致
