当我调用SimpleJdbcCall.execute(SqlParameterSource)时,我得到了一个ArrayIndexOutOfBoundsException,而且我不能在我的生活中弄清楚我做错了什么。我发现了this响应,解决方法是调用我已经在做的SimpleJdbcCall.execute(SqlParameterSource)方法。任何帮助将不胜感激。
最后一行失败的UserBean登录方法:
public static UserBean login(UserBean bean){
String userName = bean.getUserName();
String password = bean.getPassword();
String salt = "";
String returnStatus = "";
SqlParameterSource paramSource;
Map<String, String> namedParams;
Map<String, Object> outMap;
MessageDigest digest;
SimpleJdbcCall saltJDBCCall = new SimpleJdbcCall(dataSource)
.withProcedureName("getSalt")
.withoutProcedureColumnMetaDataAccess();
SimpleJdbcCall loginJDBCCall = new SimpleJdbcCall(dataSource)
.withProcedureName("userLogin")
.withoutProcedureColumnMetaDataAccess();
namedParams = new HashMap<String, String>();
namedParams.put("inLoginName", userName);
paramSource = new MapSqlParameterSource().addValues(namedParams);
outMap = saltJDBCCall.execute(paramSource);
存储过程:
CREATE PROCEDURE getSalt(
IN inLoginName VARCHAR(30),
OUT returnStatus VARCHAR(10),
OUT returnMessage VARCHAR(128))
BEGIN
IF EXISTS
(SELECT loginName
FROM EndUser
WHERE loginName = inLoginName)
THEN
SELECT 'PASS' INTO returnStatus;
SELECT salt INTO returnMessage
FROM EndUser
WHERE loginName = inLoginName
LIMIT 1;
ELSE
SELECT 'FAIL' INTO returnStatus;
SELECT 'Invalid user name or password.' INTO returnMessage;
END IF;
END//
不太有帮助的日志:
INFO: Server startup in 7965 ms
Nov 26, 2016 2:28:52 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2d55419c: startup date [Sat Nov 26 14:28:52 EST 2016]; root of context hierarchy
Nov 26, 2016 2:28:52 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Beans.xml]
Nov 26, 2016 2:28:52 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
INFO: Loaded JDBC driver: com.mysql.jdbc.Driver
java.lang.ArrayIndexOutOfBoundsException: 0
编辑:是的,我看到了重复的&#39;线程也是如此。当我单步执行代码时,最后一行抛出该异常。下一个没有达到。我用try-catch块包围了那个语句并提出了堆栈跟踪here,但这对我来说也没什么帮助。
编辑:好的。我 终于 有一个解决方案。以下行:
SimpleJdbcCall saltJDBCCall = new SimpleJdbcCall(dataSource)
.withProcedureName("getSalt")
.withoutProcedureColumnMetaDataAccess();
应该是:
SimpleJdbcCall saltJDBCCall = new SimpleJdbcCall(dataSource)
.withProcedureName("getSalt")
.withoutProcedureColumnMetaDataAccess()
.useInParameterNames("inLoginName")
.declareParameters(
new SqlParameter("inLoginName", Types.VARCHAR),
new SqlOutParameter("returnStatus", Types.VARCHAR),
new SqlOutParameter("returnMessage", Types.VARCHAR));
显然Spring并不是很聪明,可以自己注册参数。你仍然必须自己做。