Desmembrar uma List

17 respostas
T
Então o método do webservice é esse, eu busco no banco e alimento um objeto e esse objeto alimento uma lista de objetos, até ai tudo certo. Mas o retorno dessa classe é do tipo MensagemVeiculo[], não consegui passar o result com a lista, dai tentei lista.get() mas num funciona. O result tem que ser +- assim
MensagemVeiculo[] teste = new MensagemVeiculo[]{obj1,obj2........obj200};
Result teste;

a classe:

public static MensagemVeiculo[] obtemMensagensVeiculos(Integer idMensagemInicial){
        String driver = "net.sourceforge.jtds.jdbc.Driver";
        //ural = jdbc:jtds:sqlserver://endereço_ip:porta/nome_do_banco
        String url = "jdbc:jtds:sqlserver://server:1433/Integracao";
        String usuario = "sa";
        String senha   = "sa";
        int i=0;
        Connection conexao;
        Statement statement = null;
        ResultSet resultset;
        List<MensagemVeiculo> lista = new ArrayList<MensagemVeiculo>();
        
        //MensagemVeiculo[] teste = null;// = new MensagemVeiculo[]{};
       try{
            Class.forName(driver);
            conexao = DriverManager.getConnection(url, usuario, senha);
            statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
				     ResultSet.CONCUR_READ_ONLY);
            resultset = statement.executeQuery("select b.placa, b.mct,a.IIPOS_TimePosition, a.IIPOS_Latitude, a.IIPOS_Longitude from qtracsbrposicaoup a, integracao.ApoioF b where a.IIPOS_MCTAddress=1085258 and b.MCT=1085258");
//            while(resultset.next())
//            {
//            	i++;
//            }
//            resultset.last();
            while(resultset.next())
            {
                MensagemVeiculo m1 = new MensagemVeiculo();
        		m1.setId(1);
        		m1.setPlaca(resultset.getString("placa"));
        		m1.setRastreador("113134512");
        		m1.setDataHora(Calendar.getInstance());
        		m1.setLatitude(-19.000);
        		m1.setLongitude(-45.000);
        		m1.setEstado("MG");
        		m1.setCidade("Beo Horizonte");
        		m1.setLogradouro("Rua Tal");
        		lista.add(m1);
        		
            	
           }
        }
        catch(ClassNotFoundException Driver) 
        {
           
        }
        catch(SQLException Fonte) 
        {
           
}
       int j =0;
       MensagemVeiculo[] teste = null;
     for(j=0;j<=lista.size();j++){
    	teste = new MensagemVeiculo[]{lista.get(j)};
     }
     
	return teste;
        
	}

17 Respostas

drsmachado

E o senhor não pode mudar o tipo de retorno do método?
E iterar a lista e preencher o array, também não?

T

drsmachado:
E o senhor não pode mudar o tipo de retorno do método?
E iterar a lista e preencher o array, também não?

esse metodo foi passado pela empresa, no caso tem que ser desse modo.

drsmachado

Bom, então dê uma lida na documentação da interface List e da interface Collection, tenho certeza que você poderá encontrar uma ótima solução para isto.

gomesrod

MensagemVeiculo[] teste = null; for(j=0;j<=lista.size();j++){ teste = new MensagemVeiculo[]{lista.get(j)}; }
Uma confusão aqui, você não deve inicializar o array INTEIRO para cada elemento. Inicializa apenas o elemento em questão.

MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()]; // Inicializa só uma vez, com o tamanho da lista. for(j=0;j<=lista.size();j++){ // Agora pega da lista apenas o elemento em questão. teste[j] = lista.get(j); }
Assim já deve funcionar. Na verdade tem um jeito muito mais simples e performático, mas eu me recuso a contar enquanto você tiver variáveis com nome TESTE !!!

fredericomaia10

Siga este conselho e será mais feliz.

T

gomesrod:
MensagemVeiculo[] teste = null; for(j=0;j<=lista.size();j++){ teste = new MensagemVeiculo[]{lista.get(j)}; }
Uma confusão aqui, você não deve inicializar o array INTEIRO para cada elemento. Inicializa apenas o elemento em questão.

MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()]; // Inicializa só uma vez, com o tamanho da lista. for(j=0;j<=lista.size();j++){ // Agora pega da lista apenas o elemento em questão. teste[j] = lista.get(j); }
Assim já deve funcionar. Na verdade tem um jeito muito mais simples e performático, mas eu me recuso a contar enquanto você tiver variáveis com nome TESTE !!!

Assim deu certo para dar o result, mas tentando executar o metodo no WS, se mando 1 objeto somente alimentado a mão sem dados do banco e retornar certinho, mas desse jeito dá esse erro.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <soapenv:Fault> <faultcode>soapenv:Server.userException</faultcode> <faultstring>java.lang.IndexOutOfBoundsException: Index: 0, Size: 0</faultstring> <detail> <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">Tedeski-PC</ns1:hostname> </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope>

K

MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()] lista.toArray(teste);

T

Kazdum:
MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()] lista.toArray(teste);

assim ele retorna em branco.

gomesrod

tedeski:
gomesrod:
for(j=0;j<=lista.size();j++) { //....
Assim já deve funcionar.

Assim deu certo para dar o result, mas tentando executar o metodo no WS, se mando 1 objeto somente alimentado a mão sem dados do banco e retornar certinho, mas desse jeito dá esse erro.

<faultstring>java.lang.IndexOutOfBoundsException: Index: 0, Size: 0</faultstring>


Opa, vacilei feio aqui. É assim:

for(j=0;j  <   lista.size();j++) {
T

gomesrod:
tedeski:
gomesrod:
for(j=0;j<=lista.size();j++) { //....
Assim já deve funcionar.

Assim deu certo para dar o result, mas tentando executar o metodo no WS, se mando 1 objeto somente alimentado a mão sem dados do banco e retornar certinho, mas desse jeito dá esse erro.

<faultstring>java.lang.IndexOutOfBoundsException: Index: 0, Size: 0</faultstring>


Opa, vacilei feio aqui. É assim:

for(j=0;j  <   lista.size();j++) {

Já havia alterado e volta em branco. já testei se tava vindo informação do banco , está normal.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <obtemMensagensVeiculosResponse xmlns="http://servico"/> </soapenv:Body> </soapenv:Envelope>

T

tedeski:
gomesrod:
tedeski:
gomesrod:
for(j=0;j<=lista.size();j++) { //....
Assim já deve funcionar.

Assim deu certo para dar o result, mas tentando executar o metodo no WS, se mando 1 objeto somente alimentado a mão sem dados do banco e retornar certinho, mas desse jeito dá esse erro.

<faultstring>java.lang.IndexOutOfBoundsException: Index: 0, Size: 0</faultstring>


Opa, vacilei feio aqui. É assim:

for(j=0;j  <   lista.size();j++) {

Já havia alterado e volta em branco. já testei se tava vindo informação do banco , está normal.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <obtemMensagensVeiculosResponse xmlns="http://servico"/> </soapenv:Body> </soapenv:Envelope>

Descobri algo , quando eu busco no banco em um projeto aparte com a mesma classe funciona nomalmente mostra todas informações,
mas no Webservice dá problema, fiz o seguinte teste alimentando manualmente com um for como mostrado abaixo.
e no retorno trouxe tudo certo, tem alguma dica, o banco é SqlServer 2008, conectando com o library jtds.

package servico;

import java.util.Calendar;

import entidade.MensagemVeiculo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;

import javax.swing.JOptionPane;

public class LocalizadorWSM {
    static String driver = "net.sourceforge.jtds.jdbc.Driver";
    //ural = jdbc:jtds:sqlserver://endereço_ip:porta/nome_do_banco
    static String url = "jdbc:jtds:sqlserver://server:1433/Integracao";
    static String usuario = "sa";
    static String senha   = "sa";
    static int i=0;
    static Connection conexao;
    static Statement statement = null;
    static ResultSet resultset;
    static List<MensagemVeiculo> lista = new ArrayList<MensagemVeiculo>();

	public static MensagemVeiculo[] obtemMensagensVeiculos(Integer idMensagemInicial){
 
          
        //MensagemVeiculo[] teste = null;// = new MensagemVeiculo[]{};
//       try{
//            Class.forName(driver);
//            conexao = DriverManager.getConnection(url, usuario, senha);
//            statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
//				     ResultSet.CONCUR_READ_ONLY);
//            resultset = statement.executeQuery("select b.placa, b.mct,a.IIPOS_TimePosition, a.IIPOS_Latitude, a.IIPOS_Longitude from qtracsbrposicaoup a, integracao.ApoioF b where a.IIPOS_MCTAddress=1085258 and b.MCT=1085258");
//            while(resultset.next())
//            {
//            	i++;
//            }
//            resultset.last();
//            while(resultset.next())
		for(int j = 0;j<=10;j++)
            {
                MensagemVeiculo m1 = new MensagemVeiculo();
        		m1.setId(j);
        		m1.setPlaca("teste");
        		m1.setRastreador("113134512");
        		m1.setDataHora(Calendar.getInstance());
        		m1.setLatitude(-19.000);
        		m1.setLongitude(-45.000);
        		m1.setEstado("MG");
        		m1.setCidade("Beo Horizonte");
        		m1.setLogradouro("Rua Tal");
        		lista.add(m1);
        		
            	
           }
            
//        }
//        catch(ClassNotFoundException Driver) 
//        {
//           
//        }
//        catch(SQLException Fonte) 
//        {
//           
//        }
 

       MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()];   // Inicializa só uma vez, com o tamanho da lista.  
       for(int j = 0;j<lista.size();j++){    
         // Agora pega da lista apenas o elemento em questão.  
          teste[j] = lista.get(j);    
       }    

      // lista.toArray(teste);  
       return teste;  
      
        
	}
	
}
T

Até o momento sem solução. Mais alguem tem dicas???

gomesrod

Isso está muito estranho!
O problema não é mais na transformação de lista em array. Para isso o código abaixo deveria ter funcionado:

Kazdum:
MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()] lista.toArray(teste);
Essa lista já deve estar chegando errada ao fim do método! Você deveria debugar para acompanhar os valores passo-a-passo, e ver em que momento a informação se perde. Ou então incluir algumas mensagens de log (pode até ser System.println), tantas quantas forem necessárias para saber exatamente o que está acontecendo.

T

gomesrod:
Isso está muito estranho!
O problema não é mais na transformação de lista em array. Para isso o código abaixo deveria ter funcionado:
Kazdum:
MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()] lista.toArray(teste);
Essa lista já deve estar chegando errada ao fim do método! Você deveria debugar para acompanhar os valores passo-a-passo, e ver em que momento a informação se perde. Ou então incluir algumas mensagens de log (pode até ser System.println), tantas quantas forem necessárias para saber exatamente o que está acontecendo.

tentei fazer o debug, mas o eclipse não esta deixando.

em uma aplicação normal, copiei a classe e funciona normalmente.

Failed to connect to remote VM. Connection timed out. org.eclipse.jdi.TimeoutException

T

bom dia, até o momento não resolvi o problema, queria saber se estou certo usando a busca sql assim, ou devo implementar JPA??

gomesrod

Tente “debugar” usando mensagens de log. Acho que é algum erro simples em algum lugar do código que está fazendo os dados se perderem… certifique-se que os dados chegam até o final da execução do método!

T
gomesrod:
tedeski:
tentei fazer o debug, mas o eclipse não esta deixando.
Tente "debugar" usando mensagens de log. Acho que é algum erro simples em algum lugar do código que está fazendo os dados se perderem.... certifique-se que os dados chegam até o final da execução do método!

Obrigado. consegui ..... depois de tanto sacrificio é uma coisa boba...aff. não acredito.

O JTDS não estava na Pasta WEB-INF/LIB.

foi só fazer a copia e magica. (não acredito).

Mas mesmo assim obrigado, pela ajuda .

package servico;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import entidade.MensagemVeiculo;

public class LocalizadorWSM {
    static String driver = "net.sourceforge.jtds.jdbc.Driver";  
    //ural = jdbc:jtds:sqlserver://endereço_ip:porta/nome_do_banco  
    static String url = "jdbc:jtds:sqlserver://server:1433/Integracao";  
    static String usuario = "sa";  
    static String senha   = "sa";  
    static int i=0; 
    static int j=0; 
    static Connection conexao;  
    static Statement statement = null;  
    static ResultSet resultset;  
    static List<MensagemVeiculo> lista = new ArrayList<MensagemVeiculo>();  

	public static MensagemVeiculo[] obtemMensagensVeiculos(Integer idMensagemInicial) throws ClassNotFoundException, SQLException{
       
      Class.forName(driver);  
      conexao = DriverManager.getConnection(url, usuario, senha);  
      statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  
             ResultSet.CONCUR_READ_ONLY);  
     resultset = statement.executeQuery("select b.placa, b.mct,a.IIPOS_TimePosition, a.IIPOS_Latitude, a.IIPOS_Longitude from qtracsbrposicaoup a, integracao.ApoioF b where a.IIPOS_MCTAddress=b.MCT");  
     	int j=0;
//     while(resultset.next())
//     {
//    	j++; 
//     }
     
     
      while(resultset.next())
//     for(int j = 0;j<=10000;j++) 
      {  
          MensagemVeiculo m1 = new MensagemVeiculo();  
          m1.setId(1);  
          m1.setPlaca(resultset.getString("placa"));  
          m1.setRastreador(resultset.getString("mct"));  
          m1.setDataHora(Calendar.getInstance()); 
          m1.setLatitude(-19.000);  
          m1.setLongitude(-45.000);  
          m1.setEstado("MG");  
          m1.setCidade("Beo Horizonte");  
          m1.setLogradouro("Rua Tal");  
          lista.add(m1);  
            
            
     }  
        
  
//		MensagemVeiculo m1 = new MensagemVeiculo();
//		m1.setId(1);
//		m1.setPlaca("ABC1234dd");
//		m1.setRastreador("113134512");
//		m1.setDataHora(Calendar.getInstance());
//		m1.setLatitude(-19.000);
//		m1.setLongitude(-45.000);
//		m1.setEstado("MG");
//		m1.setCidade("Beo Horizonte");
//		m1.setLogradouro("Rua Tal");
//		
//		MensagemVeiculo m2 = new MensagemVeiculo();
//		m2.setId(2);
//		m2.setPlaca("ABC1234wew");
//		m2.setRastreador("113134512"); 
//		m2.setDataHora(Calendar.getInstance());
//		m2.setLatitude(-19.000);
//		m2.setLongitude(-45.000);
//		m2.setEstado("MG");
//		m2.setCidade("Beo Horizonte");
//		m2.setLogradouro("Rua Tal");
		
	       MensagemVeiculo[] teste = new MensagemVeiculo[lista.size()];   // Inicializa só uma vez, com o tamanho da lista.    
	       for(j = 0;j<lista.size();j++){      
	         // Agora pega da lista apenas o elemento em questão.    
	          teste[j] = lista.get(j);      
	       }  
		
		//return new MensagemVeiculo[] {m1,m2};
	       return teste; 
	}
	
}
Criado 21 de junho de 2013
Ultima resposta 27 de jun. de 2013
Respostas 17
Participantes 5