SimpleJdbcCall работает в Windows, но не в Linux

У меня есть приложение для весенней загрузки, в котором я использовал 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, и появляется такая же ошибка, может ли кто-нибудь помочь мне с этой проблемой?

Пожалуйста, включите DDL для вашей хранимой процедуры

Mark Rotteveel 31.07.2018 20:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
213
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, вы столкнулись с проблемами чувствительности к регистру (в некоторых случаях Win и MacOS игнорируют регистры идентификаторов). Проверьте свои настройки, следуя документация.

Для начала попробуйте удалить все 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 в этом конкретном фрагменте кода используйте чистый отзывная инструкция для локализации проблемы. Также было бы хорошо создать хранимую процедуру с именами параметров в одном регистре (нижний или верхний) и протестировать ее вызов.

PS. Я предполагаю, что в jdbcTemplate может быть проблема (если возможно, дайте ее определение в вопросе), поэтому для упрощения ситуации рассмотрите возможность использования new SimpleJdbcCall(dataSource).

Ответ принят как подходящий

Я нашел ответ, мне нужно было добавить

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

Надеюсь, это кому-то поможет :)

Другие вопросы по теме