2010-09-17 3 views
5

sto scrivendo un'applicazione in cui sto creando servizi web. Sto creando un'operazione (metodo) che recupera i valori della tabella del database dalla tabella del database in resultset. Quindi non possiamo restituire il valore dei risultati direttamente nei servizi web. Sto creando una classe che contiene i valori di resultset. invece di di risultati Sto tornando oggetto [] di classe appena creata come segue:Come restituire i risultati dal servizio Web in java

public HistoryInfoByUser[] get_HistoryInfoByUser(@WebParam(name = "email_Id") 
    String email_Id) throws Exception{ 

     HistoryInfoByUser[] historyIn = null; 
     if (conn != null) { 
     CallableStatement cst = conn.prepareCall("{call sp_xxxx(?)}",ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 
      cst.setString(1, email_Id); 
      ResultSet resultSet = cst.executeQuery(); 
      int rowCount = resultSet.getRow(); 

      historyIn = new HistoryInfoByUser[rowCount]; 

      while (resultSet.next()) 
      { 

       historyIn[rowCounter].setId(rowCounter);        
      historyIn[rowCounter].setStartTime((java.util.Date)resultSet.getObject(1)); 
       historyIn[rowCounter].setType((String) resultSet.getObject(2)); 


      rowCounter++; 
      } 
     } 
     return historyIn; 
    } 

ma durante il tentativo di accedere a tali valori nel client di servizi web, che sta dando java.lang.NullPointerException.

Ecco il codice che sto utilizzando in client di servizi web per l'accesso ResultSet valori:

public void get_HistoryInfoByUser(String email_Id) 
{  
       service = new DBService(); 

       port = service.getDBPort(); 

    try { 

     List<HistoryInfoByUser> historyIn = port.getHistoryInfoByUser(email_Id); 
     Iterator iterator = historyIn.iterator(); 
      while (iterator.hasNext()){ 
       System.out.print(iterator.next()+" "); 
      } 
     } catch (Exception_Exception ex) { 
     Logger.getLogger(DataBaseWSHelper.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

Ho provato a restituire un valore di riga singe restituendo un oggetto (HistoryInfoByUser) di classe appena creata, invece di oggetto [] (HistoryInfoByUser []). Funziona bene con un singolo oggetto ma dà NullPointerException quando sto usando object []. Non sto ottenendo alcun modo che mi aiuterà a superare questo problema di accesso al valore del resultset.

Ringrazio in anticipo tutti i preziosi suggerimenti che mi aiuteranno a superare questo problema.

+3

accettare le risposte per alcune domande amico !! ........ –

+0

Oh sì. Ho completamente trascurato questa parte. Grazie Srinivas per il suggerimento. –

risposta

2

Return un WebRowSet dal servizio web:

 
import javax.sql.rowset.WebRowSet; 
import com.sun.rowset.WebRowSetImpl; // Reference implementation 
... 
// get ResultSet rs from db 
WebRowSet wrs = new WebRowSetImpl(); 
wrs.populate(rs); 
// return wrs from web service 

Nota che il vostro provider JDBC potrebbe fornire un'implementazione WebRowSet specifico del fornitore. Puoi usare quello invece dell'implementazione di riferimento.

+1

Tieni presente che questa è l'opzione "rapida e sporca". A mio parere, il modo corretto per implementare ciò sarebbe definire un WSDL e uno schema in base ai requisiti aziendali e quindi implementarlo. Quindi l'interfaccia del tuo servizio web sarebbe indipendente dall'implementazione sottostante. – gpeche

+0

Sto provando a risolvere un problema simile. In che formato dovrei impostare @Produce? – Riptyde4

1

ti manca un

historyIn[rowCounter] = new HistoryInfoByUser(); 

nella parte superiore del vostro ciclo while. Quando si crea la matrice, si ottiene solo una matrice di puntatori nulli. Quindi, prima di poter accedere a un elemento dell'array, è necessario crearlo.

Ma la risposta di gpeche potrebbe essere un'idea migliore, se è quello che vuoi davvero fare.

1

Non si dovrebbe restituire un ResultSet da un servizio Web o qualsiasi altro oggetto Java.

Caricare i dati in un oggetto o struttura dati e chiudere il ResultSet nello stesso ambito in cui è stato creato.

Nella migliore delle ipotesi, il progetto persisterà il livello di persistenza; nel peggiore dei casi, avrai cursori non chiusi.