2017-01-31 10 views
1

Я пытаюсь реализовать модуль Guice, который позволяет Guacamole использовать SQLite в качестве бэкэнд. Проект Guacamole имеет общий базовый модуль JDBC. Это позволяет внедрять модули для конкретных хранилищ данных с меньшим количеством кода. Большинство строк кода в конечном итоге находятся в файлах XML-файлов. Проект предусматривает PostgreSQL and MySQL implementations.SQLite + Mybatis-guice throw ArrayIndexOutOfBoundsException

Я основал этот модуль SQLite от модуля MySQL. Для XML-файлов mapper, SQLite и MySQL достаточно похожи, что мне не нужно вносить какие-либо изменения. Однако, когда я пытаюсь использовать модуль SQLite, я получаю эту ошибку:

### Error querying database. Cause: java.lang.ArrayIndexOutOfBoundsException: 2 
### The error may exist in org/apache/guacamole/auth/jdbc/connectiongroup/ConnectionGroupMapper.xml 
### The error may involve defaultParameterMap 
### The error occurred while setting parameters 
### SQL: SELECT    guacamole_connection_group.connection_group_id,    connection_group_name,    parent_id,    type,    max_connections,    max_connections_per_user,    enable_session_affinity   FROM guacamole_connection_group   JOIN guacamole_connection_group_permission ON guacamole_connection_group_permission.connection_group_id = guacamole_connection_group.connection_group_id   WHERE guacamole_connection_group.connection_group_id IN    (     ?    )    AND user_id = ?    AND permission = 'READ';   SELECT parent_id, guacamole_connection_group.connection_group_id   FROM guacamole_connection_group   JOIN guacamole_connection_group_permission ON guacamole_connection_group_permission.connection_group_id = guacamole_connection_group.connection_group_id   WHERE parent_id IN    (     ?    )    AND user_id = ?    AND permission = 'READ';   SELECT parent_id, guacamole_connection.connection_id   FROM guacamole_connection   JOIN guacamole_connection_permission ON guacamole_connection_permission.connection_id = guacamole_connection.connection_id   WHERE parent_id IN    (     ?    )    AND user_id = ?    AND permission = 'READ'; 
### Cause: java.lang.ArrayIndexOutOfBoundsException: 2 

Похоже, проблема заключается в том, что два параметра передаются в запросе, но каждый из них повторяется три раза. Когда MyBatis генерирует PreparedStatement, она действует, как будто есть шесть параметры, которые необходимо передать в

Вот запрос имеет проблему с:.

<!-- Select multiple connection groups by identifier only if readable --> 
<select id="selectReadable" resultMap="ConnectionGroupResultMap" 
     resultSets="connectionGroups,childConnectionGroups,childConnections"> 

    SELECT 
     guacamole_connection_group.connection_group_id, 
     connection_group_name, 
     parent_id, 
     type, 
     max_connections, 
     max_connections_per_user, 
     enable_session_affinity 
    FROM guacamole_connection_group 
    JOIN guacamole_connection_group_permission ON guacamole_connection_group_permission.connection_group_id = guacamole_connection_group.connection_group_id 
    WHERE guacamole_connection_group.connection_group_id IN 
     <foreach collection="identifiers" item="identifier" 
       open="(" separator="," close=")"> 
      #{identifier,jdbcType=VARCHAR} 
     </foreach> 
     AND user_id = #{user.objectID,jdbcType=INTEGER} 
     AND permission = 'READ'; 

    SELECT parent_id, guacamole_connection_group.connection_group_id 
    FROM guacamole_connection_group 
    JOIN guacamole_connection_group_permission ON guacamole_connection_group_permission.connection_group_id = guacamole_connection_group.connection_group_id 
    WHERE parent_id IN 
     <foreach collection="identifiers" item="identifier" 
       open="(" separator="," close=")"> 
      #{identifier,jdbcType=VARCHAR} 
     </foreach> 
     AND user_id = #{user.objectID,jdbcType=INTEGER} 
     AND permission = 'READ'; 

    SELECT parent_id, guacamole_connection.connection_id 
    FROM guacamole_connection 
    JOIN guacamole_connection_permission ON guacamole_connection_permission.connection_id = guacamole_connection.connection_id 
    WHERE parent_id IN 
     <foreach collection="identifiers" item="identifier" 
       open="(" separator="," close=")"> 
      #{identifier,jdbcType=VARCHAR} 
     </foreach> 
     AND user_id = #{user.objectID,jdbcType=INTEGER} 
     AND permission = 'READ'; 

</select> 

Если я вручную заполнить параметры, Я могу выполнить это против базы данных SQLite. Кроме того, версия MySQL работает отлично.

Что, черт возьми, происходит? Что я могу сделать, чтобы отладить это? Это проблема MyBatis или что-то с JDBC-коннектором?

Если вам это поможет, вы увидите код для модуля here.

Вот метод для параметра mapper, связанный с этим запросом. Полными классами сопоставления для ConnectionGroup являются here и here. Полный XML-код для моего модуля SQLite - here.

Collection<ModelType> selectReadable(@Param("user") UserModel user, 
     @Param("identifiers") Collection<String> identifiers); 

Это то, что ConnectionGroupResultMap выглядит следующим образом:

<resultMap id="ConnectionGroupResultMap" type="org.apache.guacamole.auth.jdbc.connectiongroup.ConnectionGroupModel" > 

    <!-- Connection group properties --> 
    <id  column="connection_group_id"  property="objectID"    jdbcType="INTEGER"/> 
    <result column="connection_group_name" property="name"     jdbcType="VARCHAR"/> 
    <result column="parent_id"    property="parentIdentifier"  jdbcType="INTEGER"/> 
    <result column="type"      property="type"     jdbcType="VARCHAR" 
      javaType="org.apache.guacamole.net.auth.ConnectionGroup$Type"/> 
    <result column="max_connections"   property="maxConnections"   jdbcType="INTEGER"/> 
    <result column="max_connections_per_user" property="maxConnectionsPerUser" jdbcType="INTEGER"/> 
    <result column="enable_session_affinity" property="sessionAffinityEnabled" jdbcType="BOOLEAN"/> 

    <!-- Child connection groups --> 
    <collection property="connectionGroupIdentifiers" resultSet="childConnectionGroups" ofType="java.lang.String" 
       column="connection_group_id" foreignColumn="parent_id"> 
     <result column="connection_group_id"/> 
    </collection> 

    <!-- Child connections --> 
    <collection property="connectionIdentifiers" resultSet="childConnections" ofType="java.lang.String" 
       column="connection_group_id" foreignColumn="parent_id"> 
     <result column="connection_id"/> 
    </collection> 

</resultMap> 
+0

Не могли бы вы добавить ResultMap? – Pau

+0

'### Ошибка может включать defaultParameterMap ### Ошибка при настройке параметров'. действительно нет типа параметра в '