首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧ArrayIndexOutOfBoundsException与SimpleJdbcCall

弹簧ArrayIndexOutOfBoundsException与SimpleJdbcCall
EN

Stack Overflow用户
提问于 2013-08-30 16:29:54
回答 2查看 4K关注 0票数 1

这是我试图调用的Oracle过程:

代码语言:javascript
复制
 PROCEDURE GetCoreReportExtras
( pnAssignment IN NUMBER,
  pnUserRole in NUMBER,
  psAreaMenu in VARCHAR2,
  pnAreaLevel in NUMBER,
  curReportList OUT outcur,
  psLDO in VARCHAR2 default 'none',
  pnAcisNumber in NUMBER default 0);

以下是我的Java代码:

代码语言:javascript
复制
private class GetStandardReportExtrasSPV2{
    int nAreaLevel;
    int nAssignment;
    int nUserRole;
    int nAcisNum = 0;
    String strAreaMenu;     
    String strLDO = null;

    private SimpleJdbcTemplate simpleJdbcTemplate;
    private SimpleJdbcCall procGetReportExtras;

    public GetStandardReportExtrasSPV2(DataSource ds, int nUserRole, String strAreaMenu,
            int nAssignment, int nAreaLevel, String strLDO, int nAcisNum) {

        this.simpleJdbcTemplate = new SimpleJdbcTemplate(ds);
        JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
        jdbcTemplate.setResultsMapCaseInsensitive(true);
        this.procGetReportExtras =
                new SimpleJdbcCall(jdbcTemplate)
                    .withCatalogName("package")
                    .withProcedureName("proc")
                    .returningResultSet(REPORT_LIST,
                                ParameterizedBeanPropertyRowMapper.newInstance(Report.class));

    }

    public List<Report> getReportsList() {

        Map<String, Object> params = new HashMap<String, Object>();

        params.put(USER_ASSIGNMENT, nAssignment);
        params.put(USER_ROLE, nUserRole);
        params.put(AREA_MENU, strAreaMenu);
        params.put(AREA_LEVEL, nAreaLevel);
        params.put(SEGMENT, strLDO);
        params.put(ACIS_NUMBER, nAcisNum);

        SqlParameterSource in = new MapSqlParameterSource()
        .addValues(params);

        Map m = procGetReportExtras.execute(new HashMap<String, Object>(0), in);
        return (List) m.get(REPORT_LIST);
    }

}

当getReportsList()调用execute()时,我得到以下异常:

org.springframework.jdbc.core.metadata.CallMetaDataContext.matchInParameterValuesWithCallParameters(CallMetaDataContext.java:555) org.springframework.jdbc.core.simple.AbstractJdbcCall.matchInParameterValuesWithCallParameters(AbstractJdbcCall.java:419) org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:364) org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:173) 2 java.lang.ArrayIndexOutOfBoundsException

对我做错了什么有什么暗示吗?

EN

回答 2

Stack Overflow用户

发布于 2013-08-30 17:57:42

问题就在这里

代码语言:javascript
复制
Map m = procGetReportExtras.execute(new HashMap<String, Object>(0), in);

您正在调用接受一个过载Object ...方法。这种方法

包含调用中使用的in参数值的可选数组。参数值的提供必须与为存储过程定义参数的顺序相同。

在您的调用中,这两个参数恰好是一个空HashMap和一个SqlParameterSource

调用在CallMetaDataContext#matchInParameterValuesWithCallParameters()中失败。来源:

代码语言:javascript
复制
public Map<String, ?> matchInParameterValuesWithCallParameters(Object[] parameterValues) {
    Map<String, Object> matchedParameters = new HashMap<String, Object>(parameterValues.length);
    int i = 0;
    for (SqlParameter parameter : this.callParameters) {
        if (parameter.isInputValueProvided()) {
            String parameterName =  parameter.getName();
            matchedParameters.put(parameterName, parameterValues[i++]); // fails here
        }
    }
    return matchedParameters;
}

它期望传递的数组包含7个元素(因为这正是存储过程所期望的),但它只有2个元素,即HashMapSqlParameterSource。当它尝试访问第三个(索引2)时,它会抛出一个ArrayIndexOutOfBoundsException

您可能想使用SqlParameterSource

代码语言:javascript
复制
Map m = procGetReportExtras.execute(in);
票数 1
EN

Stack Overflow用户

发布于 2013-08-30 17:54:37

您调用错误的SimpleJDBCCall.execute(Object... args);使用SimpleJDBCCall.execute(SqlParameterSource)

代码语言:javascript
复制
procGetReportExtras.execute(in);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18537576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档