2010-09-17 23 views
5

Estoy escribiendo una aplicación en la que estoy creando servicios web. Estoy creando una operación (método) que recupera los valores de la tabla de base de datos de la tabla de la base de datos en el conjunto de resultados. Por lo tanto, no podemos devolver el valor del conjunto de resultados directamente en los servicios web. Estoy creando una clase que contiene los valores del conjunto de resultados. en lugar de conjunto de resultados que voy a volver Object [] de la clase recién creada de la siguiente manera:Cómo devolver los resultados del servicio 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; 
    } 

pero al intentar acceder a esos valores en el cliente de servicios web, que está dando java.lang.NullPointerException.

aquí es el código que estoy utilizando en el cliente de servicios web para acceder conjunto de resultados valores:

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

} 

He intentado devolver un valor de fila de la chamusquina mediante la devolución de un objeto (HistoryInfoByUser) de la clase recién creada en lugar de objeto [] (HistoryInfoByUser []). Funciona bien con un solo objeto pero dando NullPointerException cuando estoy usando object []. No estoy obteniendo ningún camino que me ayude a superar este problema de acceso al valor del conjunto de resultados.

Agradezco de antemano todas sus valiosas sugerencias que me ayudarán a superar este problema.

+3

acepta respuestas para algunas preguntas amigo !! ........ –

+0

Oh sí. Descuidé completamente esta parte. Gracias Srinivas por la pista. –

Respuesta

2

devolver un WebRowSet de su servicio 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 

Tenga en cuenta que su proveedor de JDBC puede proporcionar una implementación WebRowSet específico del proveedor. Puede usar eso en lugar de la implementación de referencia.

+1

Tenga en cuenta que esta es la opción "rápida y sucia". En mi opinión, la forma correcta de implementar esto sería definir un WSDL y un esquema de acuerdo con los requisitos del negocio y luego implementarlo. Entonces su interfaz de servicio web sería independiente de la implementación subyacente. – gpeche

+0

Estoy tratando de resolver un problema similar. ¿A qué formato debería establecer @Produces? – Riptyde4

1

Usted se echa en falta un

historyIn[rowCounter] = new HistoryInfoByUser(); 

en la parte superior de su bucle while. Cuando crea la matriz, solo obtiene una matriz de punteros nulos. Entonces, antes de que pueda acceder a un elemento de la matriz, debe crearlo.

Pero la respuesta de gpeche podría ser una mejor idea, si eso es lo que realmente quieres hacer.

1

No debe devolver un ResultSet de un servicio web o cualquier otro objeto Java.

Cargue los datos en un objeto o estructura de datos y cierre el ResultSet en el mismo ámbito en el que fue creado.

En el mejor de los casos, su diseño tendrá un nivel de persistencia que se escapa; en el peor, tendrás cursores no cerrados.

Cuestiones relacionadas