2010-09-17 20 views
5

Piszę aplikację, w której tworzę serwisy internetowe. Tworzę operację (metodę), która pobiera wartości tabeli bazy danych z tabeli bazy danych w zestawie wyników. Dlatego nie możemy zwrócić wartości zestawu wyników bezpośrednio w usługach internetowych. Tworzę klasę, która przechowuje wartości z zestawu wyników. zamiast wynikowego Wracam Object [] nowo utworzonej klasy następująco:Jak zwrócić zestaw wyników z usługi internetowej w 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; 
    } 

ale podczas próby uzyskania dostępu do tych wartości w kliencie usług internetowych, to daje java.lang.NullPointerException.

tutaj jest kod, który używam w kliencie usług internetowych dostępu do wynikowego wartości:

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

} 

Próbowałem powrocie wartość małpa wiersz po powrocie obiekt (HistoryInfoByUser) nowo utworzonej klasie zamiast obiektu [] (HistoryInfoByUser []). Działa z jednym obiektem, ale daje wyjątek NullPointerException, gdy używam obiektu []. Nie dostaję żadnej drogi, która pomoże mi przezwyciężyć ten problem z dostępem do wartości zestawu wyników.

Z góry dziękuję wszystkim cennym sugestiom, które pomogą mi przezwyciężyć ten problem.

+3

zaakceptować odpowiedzi na niektóre pytania koleś !! ........ –

+0

O tak. Całkowicie zaniedbałem tę część. Dziękuję Srinivasowi za podpowiedź. –

Odpowiedz

2

zwrócić WebRowSet z usługą internetową:

 
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 

Pamiętaj, że Twój dostawca JDBC może zapewnić realizację WebRowSet specyficzny dla dostawcy. Możesz użyć tego zamiast implementacji referencyjnej.

+1

Pamiętaj, że jest to opcja "szybka i brudna". Moim zdaniem właściwym sposobem wdrożenia tego byłoby zdefiniowanie WSDL i schematu zgodnie z wymaganiami biznesowymi, a następnie wdrożenie tego. Wtedy twój interfejs usługi sieciowej byłby niezależny od podstawowej implementacji. – gpeche

+0

Próbuję rozwiązać podobny problem. W jakim formacie ustawię @Producje? – Riptyde4

1

tracisz

historyIn[rowCounter] = new HistoryInfoByUser(); 

w górnej części pętli while. Gdy tworzysz tablicę, dostajesz tylko tablicę wskaźników zerowych. Zanim więc uzyskasz dostęp do elementu tablicy, musisz go utworzyć.

Ale odpowiedź gpeche może być lepszym pomysłem, jeśli tak naprawdę chcesz robić.

1

Nie powinieneś zwracać zestawu wyników z usługi WWW lub innego obiektu Java.

Załaduj dane do obiektu lub struktury danych i zamknij zestaw wyników w tym samym zakresie, w którym został utworzony.

W najlepszym przypadku twój projekt będzie miał wyciek poziomu trwałości; w najgorszym razie będziesz miał niezamkniętych kursorów.

Powiązane problemy