Java SimpleJDBCall正在返回null
下面的代码试图调用存储过程rp_报告。但它返回空指针异常。有关更多信息,请参阅下面的日志和代码。Java SimpleJDBCall正在返回null,java,sql-server,spring,spring-boot,spring-jdbc,Java,Sql Server,Spring,Spring Boot,Spring Jdbc,下面的代码试图调用存储过程rp_报告。但它返回空指针异常。有关更多信息,请参阅下面的日志和代码。 我怀疑错误出现在类型为LocalDate的输入参数中。但是我找不到任何日志来说明发生此错误的原因。此应用程序使用SpringBoot和SimpleJDBCall调用存储过程 非常感谢您的帮助 import java.time.LocalDate; import java.util.Map; import org.apache.log4j.Logger; import org.octopoda.m
我怀疑错误出现在类型为LocalDate的输入参数中。但是我找不到任何日志来说明发生此错误的原因。此应用程序使用SpringBoot和SimpleJDBCall调用存储过程 非常感谢您的帮助
import java.time.LocalDate;
import java.util.Map;
import org.apache.log4j.Logger;
import org.octopoda.model.RptByCourier;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;
@Repository
public class RptByCourierSPRepo {
private static final Logger logger = Logger.getLogger(RptByCourierSPRepo.class);
@Autowired
private SimpleJdbcCall spCall;
public RptByCourier callRptByCourierSP(LocalDate startDate, LocalDate endDate, Integer branchId) {
logger.info("Initiate Store Procedure rp_report");
RptByCourier spReturn = new RptByCourier();
spCall.withCatalogName("dbo"); <----Newly Added
spCall.withProcedureName("Rp_Report");
SqlParameterSource sqlParam = new MapSqlParameterSource()
.addValue("StartDate", startDate)
.addValue("EndDate", endDate)
.addValue("Branch", branchId);
Map<String, Object> spResult = Objects.requireNonNull(spCall.execute(sqlParam), "spCall.execute() returned null");
/**Setters here Truncated*/
return spReturn;
}
}
新增配置
@Configuration
@ComponentScan("org.octopoda")
public class OctopodaConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
dataSource.setUrl("jdbc:sqlserver://localhost:1433;DatabaseName=Test");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}
@Bean
public SimpleJdbcCall simpleJdbc(DataSource datasource) {
return new SimpleJdbcCall(datasource);
}
添加了下面的行,现在它要求没有StartDate参数的输入
spCall.withCatalogName("dbo");
错误日志2
我不知道
@Autowired
是什么意思,但可能是spCall
没有初始化吗?@axel Autowired是一个用于连接bean的spring注释,是的,它是初始化的,部件没有问题。如果您确定引发异常的确切位置,肯定会有所帮助,例如,如果您的日志没有显示行号,则使用如下Objects.requirennull
:Map spResult=Objects.requirennull(spCall.execute(sqlParam),“spCall.execute()返回null”)
。@axel按照您的建议更新了代码,但仍然找不到提到spCall.execute的部分。。。。但是我已经更新了日志,并在提到错误的地方放了一行。好吧,那:String.valueOf(spResult.get(“PODsCompleted”).toString()
没有任何意义。您应该使用String.valueOf(spResult.get(“PODsCompleted”)
。
rp_report '2015-01-01','2015-01-02',213
Rp_Report (StartDate, EndDate, Branch)
where
StartDate is datetime
EndDate is datetime
Branch is int
@Configuration
@ComponentScan("org.octopoda")
public class OctopodaConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
dataSource.setUrl("jdbc:sqlserver://localhost:1433;DatabaseName=Test");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}
@Bean
public SimpleJdbcCall simpleJdbc(DataSource datasource) {
return new SimpleJdbcCall(datasource);
}
spCall.withCatalogName("dbo");
org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call dbo.rp_report()}]; SQL state [S0004]; error code [201]; Procedure or function 'rp_report' expects parameter '@StartDate', which was not supplied.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Procedure or function 'rp_report' expects parameter '@StartDate', which was not supplied.
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]