El mapa de resultados se ve así:
<resultMap id="UserResult" type="User">
<id property="userId" column="userId"/>
<result property="firstName" column="firstName"/>
<result property="lastName" column="lastName"/>
</resultMap>
En su declaración de selección, cambie el tipo de parámetro a java.util.Map.
<select id="getUsers" statementType="CALLABLE" parameterType="java.util.Map">
{call GetUsers(#{users, jdbcType=CURSOR, javaType=java.sql.ResultSet, mode=OUT, resultMap=UserResult})}
</select>
La interfaz de su mapeador se ve así, parece que actualmente lo está llamando DAO. La forma en que lo hice en el pasado es crear una interfaz de mapeador que se inyecta en el DAO y el DAO es lo que llama a los métodos en el mapeador. Aquí hay una interfaz de mapeador de ejemplo:
public interface UserMapper {
public Object getUsers(Map<String, Object> params);
}
Esa clase de mapeador luego se inyectaría en una clase DAO y haría la llamada así:
public List<User> getUsers() {
Map<String, Object> params = new HashMap<String, Object>();
ResultSet rs = null;
params.put("users", rs);
userMapper.getUsers(params);
return ((ArrayList<User>)params.get("users"));
}