2010-09-17 4 views
5

J'écris une application dans laquelle je crée des services web. Je crée une opération (méthode) qui extrait les valeurs de la table de base de données de la table de base de données dans resultset. Par conséquent, nous ne pouvons pas retourner la valeur resultset directement dans les services Web. Je crée une classe qui contient les valeurs de resultset. au lieu de resultset je retourne l'objet [] de la classe nouvellement créée comme suit:Comment retourner le resultset du service web en 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; 
    } 

mais tout en essayant d'accéder à ces valeurs dans le client de service Web, il donne java.lang.NullPointerException.

est ici le code que j'utilise dans le client de services Web pour accéder à resultset valeurs:

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

} 

J'ai essayé de retourner une valeur de ligne de flambage en retournant un objet (HistoryInfoByUser) de la classe nouvellement créée au lieu d'objet [] (HistoryInfoByUser []). Cela fonctionne bien avec un seul objet mais en donnant NullPointerException lorsque j'utilise object []. Je ne reçois aucun moyen qui m'aidera à surmonter ce problème d'accès à la valeur resultset.

Je remercie d'avance toutes vos précieuses suggestions qui m'aideront à surmonter ce problème.

+3

accepter les réponses à certaines questions mec !! ........ –

+0

Oh oui. J'ai complètement négligé cette partie. Merci à Srinivas pour l'indice. –

Répondre

2

Retour un WebRowSet de votre service 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 

Notez que votre fournisseur JDBC pourrait fournir une implémentation WebRowSet spécifique au fournisseur. Vous pouvez l'utiliser à la place de l'implémentation de référence.

+1

Gardez à l'esprit que c'est l'option "rapide et sale". À mon avis, la meilleure façon de l'implémenter serait de définir un WSDL et un schéma en fonction des besoins de l'entreprise, puis de l'implémenter. Votre interface de service Web sera alors indépendante de l'implémentation sous-jacente. – gpeche

+0

J'essaie de résoudre un problème similaire. Dans quel format est-ce que je définirais @Produces? – Riptyde4

1

Il vous manque un

historyIn[rowCounter] = new HistoryInfoByUser(); 

au sommet de la boucle while. Lorsque vous créez le tableau, vous obtenez uniquement un tableau de pointeurs NULL. Avant de pouvoir accéder à un élément de tableau, vous devez le créer.

Mais la réponse de gpeche pourrait être une meilleure idée, si c'est ce que vous voulez vraiment faire.

1

Vous ne devez pas renvoyer un ResultSet à partir d'un service Web ou d'un autre objet Java.

Chargez les données dans un objet ou une structure de données et fermez le ResultSet dans la même étendue dans laquelle il a été créé. Dans le meilleur des cas, le niveau de persistance de votre conception sera dépassé; au pire, vous aurez des curseurs non fermés.