java spring jdbctemplate:设置值中的空指针异常

pdsfdshx  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(140)

我的错误

java.lang.NullPointerException.
 MyDAO$2.setValues
    org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:680)
    org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:454)
    org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:676)
    org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:738)

net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:694)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:639)

我的代码是

this.jdbcTemplate.update(SOME_SQL_UPDATE, new PreparedStatementSetter() {
                    public void setValues(PreparedStatement ps) throws SQLException {
                        ps.setBoolean(1, myObj.isVal1());
                        ps.setString(2, myObj.getVal2().toString());
                    }
                });

public class myObj {
    private boolean val1;
    private Enum val2;
}

我的db列的boolean是number(1,0),我的set string列是varchar。
注意:我正在使用Spring 1.2,目前正在升级到Spring 3。
会有什么问题呢?
我该怎么解决这个问题?

e5njpo68

e5njpo681#

你确定myObj不为null吗?看起来它可能是该语句中唯一可以为null的对象。你能对方法中的对象做一个简单的null检查来确认吗?

72qzrwbm

72qzrwbm2#

在类myObj中,val1val2的值从未初始化。

3pvhb19x

3pvhb19x3#

我通过使用setObject而不是setBooleansetString解决了这个问题:

this.jdbcTemplate.update(SOME_SQL_UPDATE, new PreparedStatementSetter() {
  public void setValues(PreparedStatement ps) throws SQLException {
    ps.setObject(1, myObj.isVal1() ? 1 : 0, Types.NUMERIC);
    ps.setObject(2, myObj.getVal2().toString(), Types.VARCHAR);
  }
});

注意:在我的例子中,我使用的是Oracle 12c,布尔值存储为数字(true =〉1,false =〉0)

相关问题