SpringBoot调用Oracle存储过程触发NullPointerException求助
SpringBoot调用Oracle存储过程触发NullPointerException排查方案
在SpringBoot项目中调用Oracle存储过程PROC_SUBMITMSG时触发java.lang.NullPointerException,已创建对应实体类与Repository接口,调用时传入了参数值,但仍报错。项目中其他存储过程可正常调用,直接通过DBeaver调用该存储过程也能正常执行。
相关代码与日志
实体类代码
@NamedStoredProcedureQuery(name = "MsgEntity.submitMsg", procedureName = "PROC_SUBMITMSG", parameters = { @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM1", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM2", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM3", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM4", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM5", type = String.class), @StoredProcedureParameter(mode = ParameterMode.OUT, name = "RESULT1", type = String.class), @StoredProcedureParameter(mode = ParameterMode.OUT, name = "RESULT2", type = String.class), @StoredProcedureParameter(mode = ParameterMode.OUT, name = "RESULT3", type = String.class)}
Repository代码
Map<String, String> submitMsg(@Param("PARAM1") String PARAM1, @Param("PARAM2") String PARAM2, @Param("PARAM3") String PARAM3, @Param("PARAM4") String PARAM4, @Param("PARAM5") String PARAM5,);
调用代码
Map<String, String> smsBillResponse = smsRepository.submitMsg("value1","value2","value3","value4","value5");
日志信息
ERROR [org.springframework.boot.web.servlet.support.ErrorPageFilter] (default task-1) Forwarding to error page from request [/foo/fooo/foooo] due to exception [null]: java.lang.NullPointerException
排查与解决步骤
修复Repository方法的语法错误
Repository方法参数末尾多了一个冗余逗号@Param("PARAM5") String PARAM5,);,这会导致Spring无法正确生成代理类,调用时触发NPE。去掉末尾逗号:Map<String, String> submitMsg(@Param("PARAM1") String PARAM1, @Param("PARAM2") String PARAM2, @Param("PARAM3") String PARAM3, @Param("PARAM4") String PARAM4, @Param("PARAM5") String PARAM5);补全实体类注解的完整性
确认MsgEntity类添加了@Entity注解,且@NamedStoredProcedureQuery注解完整闭合(当前代码缺少末尾的)和;),正确示例:@Entity @NamedStoredProcedureQuery(name = "MsgEntity.submitMsg", procedureName = "PROC_SUBMITMSG", parameters = { @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM1", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM2", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM3", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM4", type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "PARAM5", type = String.class), @StoredProcedureParameter(mode = ParameterMode.OUT, name = "RESULT1", type = String.class), @StoredProcedureParameter(mode = ParameterMode.OUT, name = "RESULT2", type = String.class), @StoredProcedureParameter(mode = ParameterMode.OUT, name = "RESULT3", type = String.class) }) public class MsgEntity { // 实体类字段及其他配置 }验证存储过程参数映射一致性
核对Oracle存储过程的参数名称、类型、输入输出模式与@StoredProcedureParameter配置完全匹配,注意Oracle参数名称不区分大小写,但注解配置需与存储过程定义一致。开启SQL日志调试
在配置文件中开启Hibernate SQL日志,查看实际执行的存储过程调用语句和参数绑定情况,排查参数传递异常:logging: level: org.hibernate.SQL: DEBUG org.hibernate.type.descriptor.sql.BasicBinder: TRACE检查Repository接口继承关系
确认Repository接口正确继承JpaRepository或相关存储过程支持的父接口,示例:@Repository public interface SmsRepository extends JpaRepository<MsgEntity, Long> { Map<String, String> submitMsg(@Param("PARAM1") String PARAM1, @Param("PARAM2") String PARAM2, @Param("PARAM3") String PARAM3, @Param("PARAM4") String PARAM4, @Param("PARAM5") String PARAM5); }
内容的提问来源于stack exchange,提问作者AzamAld
相关产品推荐
相关产品推荐

