Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleJDBCall可以在windows中工作,但不能在linux中工作_Java_Spring Boot_Spring Jdbc - Fatal编程技术网

Java SimpleJDBCall可以在windows中工作,但不能在linux中工作

Java SimpleJDBCall可以在windows中工作,但不能在linux中工作,java,spring-boot,spring-jdbc,Java,Spring Boot,Spring Jdbc,我有一个spring boot应用程序,我使用SimpleJDBCall来执行一个存储过程,在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; expec

我有一个spring boot应用程序,我使用SimpleJDBCall来执行一个存储过程,在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;

    }
@覆盖
公共场所(Credenciales Credenciales){
SimpleJdbcCall jdbcCall=新SimpleJdbcCall(jdbcTemplate)
.使用程序重命名(“spcon评估”)
.declareParameters(新的SqlParameter(“in_usuario”,Types.CHAR))
.declareParameters(新的SqlParameter(“in_contrasena”,Types.CHAR))
.declareParameters(新的SqlParameter(“in_idistema”,Types.INTEGER))
.declareParameters(新的SqlOutParameter(“out_idUsuario”,Types.INTEGER))
.declareParameters(新的SqlOutParameter(“out_nombre”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_paterno”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_materno”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_idPerfil”,Types.INTEGER))
.declareParameters(新的SqlOutParameter(“out_nombrePerfil”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_idComercio”,Types.INTEGER))
.declareParameters(新的SQLOutperParameter(“out_nombreComercio”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_idTerminal”,Types.INTEGER))
.declareParameters(新的SqlOutParameter(“out_nombreTerminal”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_idSucursal”,Types.INTEGER))
.declareParameters(新的SqlOutParameter(“out_referenceRetireofectivo”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_IdprovedorSucursal”,Types.INTEGER))
.declareParameters(新的SqlOutParameter(“out_codigo”,Types.CHAR))
.declareParameters(新的SqlOutParameter(“out_mensaje”,Types.CHAR));
SqlParameterSource in=新映射SqlParameterSource()
.addValue(“in_usuario”,credenciales.getUsuario())
.addValue(“in_contrasena”,credenciales.getContrasena())
.addValue(“in_idistema”,credenciales.getidistema());
Map result=jdbcCall.execute(in);
@抑制警告(“未选中”)
列表菜单=菜单
.obtenerListaMenus((List)result.get(“#result-set-1”);
String codigo=(String)result.get(“out_codigo”);
如果(codigo!=null&&codigo.equals(“00”)){
试一试{
返回新的Usuario(
Util.ifNullToLong(result.get(“out_idUsuario”),0L),
Util.ifNullToString(result.get(“out_nombre”),“”),
Util.ifNullToString(result.get(“out\u paterno”),“”),
Util.ifNullToString(result.get(“out_materno”),“”),
Util.ifNullToString(result.get(“out_referenceRetireofectivo”),“”),
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_idproveredorsucursal”),0L),
菜单
);
}捕获(例外e){
e、 printStackTrace();
}
}
返回null;
}

另外,我尝试使用带有openjdk8的docker容器,出现了相同的错误,有人能帮我解决这个问题吗?

看起来您面临区分大小写的问题(在某些情况下,Win和MacOS会忽略标识符的情况)。检查您的设置,如下所示

首先,尝试删除所有
申报参数
——不需要它们

 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);
SimpleJdbcCall jdbcCall=新SimpleJdbcCall(jdbcTemplate)
.使用程序重命名(“spcon评估”);
中的SqlParameterSource=
新的MapSqlParameterSource()
.addValue(“in_usuario”,credenciales.getUsuario())
.addValue(“in_contrasena”,credenciales.getContrasena())
.addValue(“in_idistema”,credenciales.getidistema());
Map result=jdbcCall.execute(in);
如果这没有帮助-在这段特定的代码中,使用pure代替SpringBoot工具来定位问题。最好创建一个参数名都在同一大小写(小写或大写)的存储过程,并测试其调用


P.我想在<代码> JDCBCMADSE/COD>中可能存在一个问题(如果可能的话,在问题中提供它的定义),为了简化情况,考虑使用<代码>新的SimuleDbCCALL(DATABOCE)< /> > .P> >我找到了答案,我需要添加< /P>

.withoutProcedureColumnMetaDataAccess()
对于SimpleJDBCall,如下所示:

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));

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

请将DDL包含在存储过程中