You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查与解决步骤

  1. 修复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);
    
  2. 补全实体类注解的完整性
    确认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 {
        // 实体类字段及其他配置
    }
    
  3. 验证存储过程参数映射一致性
    核对Oracle存储过程的参数名称、类型、输入输出模式与@StoredProcedureParameter配置完全匹配,注意Oracle参数名称不区分大小写,但注解配置需与存储过程定义一致。

  4. 开启SQL日志调试
    在配置文件中开启Hibernate SQL日志,查看实际执行的存储过程调用语句和参数绑定情况,排查参数传递异常:

    logging:
      level:
        org.hibernate.SQL: DEBUG
        org.hibernate.type.descriptor.sql.BasicBinder: TRACE
    
  5. 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:30:41