Как вернуть набор результатов из веб-службы в Java - PullRequest
5 голосов
/ 17 сентября 2010

Я пишу приложение, в котором я создаю веб-сервисы.я создаю операцию (метод), которая извлекает значения таблицы базы данных из таблицы базы данных в наборе результатов.Следовательно, мы не можем вернуть значение набора результатов непосредственно в веб-сервисах.я создаю класс, который содержит значения из набора результатов.вместо результирующего набора я возвращаю объект [] недавно созданного класса следующим образом:

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

, но при попытке доступа к этим значениям в клиенте веб-службы он дает java.lang.NullPointerException.

вот код, который я использую в клиенте веб-службы для доступа к значениям набора результатов:

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

 }

Я попытался вернуть значение единственной строки, возвращая объект (HistoryInfoByUser) недавно созданного класса вместо объекта [] (HistoryInfoByUser []).Он отлично работает с одним объектом, но дает NullPointerException, когда я использую object [].я не получаю никакого способа, который бы помог мне преодолеть эту проблему доступа к значению набора результатов.

Я заранее благодарен всем вашим ценным предложениям, которые помогут мне преодолеть эту проблему.

Ответы [ 3 ]

2 голосов
/ 17 сентября 2010

Возврат WebRowSet из вашего веб-сервиса:

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

Обратите внимание, что ваш поставщик JDBC может предоставить реализацию WebRowSet для конкретного поставщика. Вы можете использовать это вместо эталонной реализации.

1 голос
/ 17 сентября 2010

Вы не должны возвращать ResultSet из веб-службы или любого другого объекта Java.

Загрузить данные в объект или структуру данных и закрыть ResultSet в той же области, в которой он был создан.

В лучшем случае ваш дизайн будет иметь утечку уровня постоянства;в худшем случае у вас будут незакрытые курсоры.

1 голос
/ 17 сентября 2010

Вам не хватает

historyIn[rowCounter] = new HistoryInfoByUser();

в верхней части цикла while. Когда вы создаете массив, вы получаете только массив нулевых указателей. Поэтому, прежде чем вы сможете получить доступ к элементу массива, вам нужно его создать.

Но ответ от gpeche может быть лучше, если вы действительно этого хотите.

...