尝试使用名为JDBCTemplate的弹簧插入时出现以下错误。
相同的代码在我的本地Windows机器上运行(在jboss服务器中部署)。 但是不能在UNIX盒中使用(在Jboss服务器中部署)。 数据源由jboss服务器创建,并使用ojdbc6.jar。
该语句中发送的number参数与需要插入的参数相同。 有这个想法吗?
代码:`
@RestController
public class Test_A {
@Autowired
private PlatformTransactionManager transactionManager;
@RequestMapping(value="/addTable_A", method = RequestMethod.POST)
public @ResponseBody List<Response> addTable_A(@RequestBody RequestForm[] forms) {
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
MapSqlParameterSource parameters = new MapSqlParameterSource();
KeyHolder holder = new GeneratedKeyHolder();
for (Map.Entry<String, Object> entry : rowData.entrySet()) {
parameters = parameters.addValue(entry.getKey(), entry.getValue(),Types.VARCHAR);
getLog().writeLocation(FileLogger.ALWAYS, loggingMethod + "KEY : "+entry.getKey()+" , VALUE : "+entry.getValue());
}
getLog().writeLocation(FileLogger.ALWAYS, loggingMethod + " Before Insert -- QUERY USED :: >> " + query.toString());
int res = 0;
try{
res = namedJdbcTemplate.update(query.toString(), parameters, holder, new String[] { "id" });
}catch(Throwable t){
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
getLog().writeLocation(FileLogger.ALWAYS, loggingMethod + "In exception bloack of insert 3.3"+exceptionAsString);
}finally{
transactionManager.commit(status);
}
}
}
`
错误:`
21 09:57:09.448 com.test.Test_A [278]:addTable_A:KEY:A,VALUE:A1
21 09:57:09.448 com.test.Test_A [278]:addTable_A:KEY:B,VALUE:B1
21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:C,VALUE:C1
21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:D,VALUE:D1
21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:E,VALUE:E1
21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:F,VALUE:F1
21 09:57:09.449 com.test.Test_A [278]:addTable_A:KEY:ID,VALUE:
21 09:57:09.450 com.test.Test_A [278]:addTable_A:KEY:G,VALUE:G1
21 09:57:09.450 com.test.Test_A [278]:addTable_A:KEY:H,VALUE:H1
21 09:57:09.450 com.test.Test_A [278]:addTable_A:KEY:I,VALUE:I1
21 09:57:09.451 com.test.Test_A [287]:validateInputData:插入之前-查询已使用:: >>插入到table_A(A,B,C,D,E,F,ID,G, H,I)值(:A,:B,:C,:D,:E,:F,:ID,:G,:H,:I)
21 09:57:09.559 com.test.Test_A [297]:validateInputData:在插入中出现异常3.3org.springframework.jdbc.UncategorizedSQLException:PreparedStatementCallback; SQL的未分类SQLException [插入table_A(A,B,C,D,E,F,ID,G,H,I,J)值(?,?,?,?,?,?,?,?,?,? ,?,sysdate)]; SQL状态[null];错误代码[0];错误;嵌套异常为java.sql.SQLException:错误 在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) 在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645) 在org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:900) 在org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:318)
`
答案 0 :(得分:0)
您指定在一个环境中可以正常运行,而在另一个环境中则不能运行。
在这种情况下,要做的第一件事就是明确指定参数的类型。
由于NamedParameterJdbcTemplate#update
接受SqlParamaterSource
,我想您正在使用MapSqlParameterSource
,因此您可能要使用
addValue(String paramName, Object value, int sqlType)
添加参数的方法。您可以在java.sql.Types
下找到SQL类型。
无论如何,正如我在评论中所写的那样,发布执行的SQL语句和参数的映射。