SimpleJdbcCall在Windows中有效,但在Linux中无效

时间:2018-07-31 17:41:59

标签: java spring-boot spring-jdbc

我有一个Spring Boot应用程序,在其中使用SimpleJdbcCall执行存储过程,在Windows(jdk1.8.0_111)中一切正常,但是当我尝试在Linux服务器(使用Java 1.8.0_131)上运行该应用程序时错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect number of arguments for PROCEDURE banco.spcon_sesion; expected 18, got 0

这是我的代码:

@Override
public Usuario sesion(Credenciales credenciales) {

        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("spcon_sesion")
            .declareParameters(new SqlParameter("in_usuario", Types.CHAR))
            .declareParameters(new SqlParameter("in_contrasena", Types.CHAR))
            .declareParameters(new SqlParameter("in_idSistema", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_idUsuario", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombre", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_paterno", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_materno", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idPerfil", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombrePerfil", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idComercio", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombreComercio", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idTerminal", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombreTerminal", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idSucursal", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_referenciaRetiroEfectivo", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idProveedorSucursal", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_codigo", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_mensaje", Types.CHAR));

        SqlParameterSource in = new MapSqlParameterSource()
            .addValue("in_usuario", credenciales.getUsuario())
            .addValue("in_contrasena", credenciales.getContrasena())
            .addValue("in_idSistema", credenciales.getIdSistema());

        Map<String, Object> result = jdbcCall.execute(in);

        @SuppressWarnings("unchecked")
        List<Menu> menus = Menu
                .obtenerListaMenus((List<Map<String, Object>>) result.get("#result-set-1"));

        String codigo = (String) result.get("out_codigo");
        if (codigo != null && codigo.equals("00")) {
            try {

                return new Usuario(
                    Util.ifNullToLong(result.get("out_idUsuario"), 0L),
                    Util.ifNullToString(result.get("out_nombre"), ""),
                    Util.ifNullToString(result.get("out_paterno"), ""),
                    Util.ifNullToString(result.get("out_materno"), ""),
                    Util.ifNullToString(result.get("out_referenciaRetiroEfectivo"), ""),
                    Util.ifNullToLong(result.get("out_idComercio"), 0L),
                    Util.ifNullToString(result.get("out_nombreComercio"), ""),
                    Util.ifNullToLong(result.get("out_idTerminal"), 0L),
                    Util.ifNullToString(result.get("out_nombreTerminal"), ""),
                    Util.ifNullToLong(result.get("out_idPerfil"), 0L),
                    Util.ifNullToString(result.get("out_nombrePerfil"), ""),
                    Util.ifNullToLong(result.get("out_idSucursal"), 0L),
                    Util.ifNullToLong(result.get("out_idProveedorSucursal"), 0L),
                    menus
                );

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return null;

    }

我也尝试使用带有openjdk8的docker容器,并且出现相同的错误,有人可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您似乎正面临区分大小写的问题(在某些情况下,Win和MacOS会忽略标识符的大小写)。按照documentation检查设置。

首先,尝试删除所有declareParameters-不需要它们。

 SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
                               .withProcedureName("spcon_sesion");

 SqlParameterSource in =
     new MapSqlParameterSource()
            .addValue("in_usuario", credenciales.getUsuario())
            .addValue("in_contrasena", credenciales.getContrasena())
            .addValue("in_idSistema", credenciales.getIdSistema());

 Map<String, Object> result = jdbcCall.execute(in);

如果这没有帮助-而不是在这段特定代码中使用SpringBoot工具,请使用纯callable statement来定位问题。创建具有相同名称(低位或高位)的参数名称的存储过程并测试其调用也将是很好的。

PS。我想jdbcTemplate中可能存在问题(如果可能,请在问题中提供其定义),因此为了简化这种情况,请考虑使用new SimpleJdbcCall(dataSource)

答案 1 :(得分:0)

我找到了答案,我需要添加

.withoutProcedureColumnMetaDataAccess()
像这样

到simpleJdbcCall:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("spcon_sesion")
            .withoutProcedureColumnMetaDataAccess()
            .declareParameters(new SqlParameter("in_usuario", Types.CHAR))
            .declareParameters(new SqlParameter("in_contrasena", Types.CHAR))
            .declareParameters(new SqlParameter("in_idSistema", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_idUsuario", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombre", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_paterno", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_materno", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idPerfil", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombrePerfil", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idComercio", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombreComercio", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idTerminal", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_nombreTerminal", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idSucursal", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_referenciaRetiroEfectivo", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_idProveedorSucursal", Types.INTEGER))
            .declareParameters(new SqlOutParameter("out_codigo", Types.CHAR))
            .declareParameters(new SqlOutParameter("out_mensaje", Types.CHAR));

希望这对某人有所帮助:)