我正在编写一个我正在创建Web服务的应用程序。我正在创建一个操作(方法),它从结果集中的数据库表中检索数据库表值。因此,我们无法直接在Web服务中返回结果集值。我正在创建一个包含结果集值的类。而不是结果集我返回新创建的类的对象[],如下所示:
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;
}
但是在尝试访问Web服务客户端中的那些值时,它给出了java.lang.NullPointerException。
这是我在Web服务客户端中用于访问结果集的代码 价值观:
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);
}
}
我尝试通过返回新创建的类而不是object [](HistoryInfoByUser [])的对象(HistoryInfoByUser)来返回单行值。它对单个对象工作正常,但在使用object []时给出NullPointerException。我没有任何方法可以帮助我克服访问结果集值的问题。
我提前感谢您提出的所有有价值的建议,这些建议将帮助我克服这个问题。
答案 0 :(得分:2)
从您的网络服务返回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 :(得分:1)
你错过了
historyIn[rowCounter] = new HistoryInfoByUser();
在你的while循环的顶部。创建数组时,只获得一个空指针数组。因此,在您可以访问数组项之前,您需要创建它。
但如果那是你真正想做的事情,那么gpeche的回答可能是个更好的主意。
答案 2 :(得分:1)
您不应该从Web服务或任何其他Java对象返回ResultSet。
将数据加载到对象或数据结构中,并在创建它的同一范围内关闭ResultSet。
充其量,您的设计将使持久层漏掉;在最坏的情况下,你会有未封闭的游标。