2011-06-28 16 views
0

gwt RPCを使用してxlsファイルを読みたいと思っています。通常のファイルで正常に実行されたコードを使用しているときに、ファイルをロードできず、NULLポインタ例外が返されます。xlsファイルをgwtで読む

 final AsyncCallback<String> callback1 = new AsyncCallback<String>() { 
     public void onSuccess(String result) { 
      RootPanel.get().add(new Label("In success")); 
      if(result==null) 
      { 
      RootPanel.get().add(new Label("result is null")); 
      } 
      RootPanel.get().add(new Label("result is"+result)); 


     } 
      public void onFailure(Throwable caught) { 
      RootPanel.get().add(new Label("In Failure"+caught)); 
      } 
     }; 
     try{ 
     getService().getNumberOfColumns(callback1); 
    }catch(Exception e){} 

}

Plsはどのように私はこの問題を解決することができます教えてください:以下の

は、私は、このコードによってクライアントプログラムでそれを呼び出しています { {

import com.arosys.readExcel.ReadXLSX; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 
import org.Preview.client.GWTReadXL; 
import java.io.InputStream; 
import com.arosys.customexception.FileNotFoundException; 
import com.arosys.logger.LoggerFactory; 
import java.util.Iterator; 
import org.apache.log4j.Logger; 
import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
/** 
* 
* @author Amandeep 
*/ 
public class GWTReadXLImpl extends RemoteServiceServlet implements GWTReadXL 
{ 
    private String fileName; 
    private String[] Header=null; 
    private String[] RowData=null; 
    private int sheetindex; 
    private String sheetname; 
    private XSSFWorkbook workbook; 
    private XSSFSheet sheet; 
    private static Logger logger=null; 


public void loadXlsxFile() throws Exception 
    { 
     logger.info("inside loadxlsxfile:::"+fileName); 
     InputStream resourceAsStream =ClassLoader.getSystemClassLoader().getSystemResourceAsStream("c:\\test2.xlsx"); 
     logger.info("resourceAsStream-"+resourceAsStream); 
     if(resourceAsStream==null) 
      throw new FileNotFoundException("unable to locate give file"); 
     else 
     { 
       try 
       { 
        workbook = new XSSFWorkbook(resourceAsStream); 
        sheet = workbook.getSheetAt(sheetindex); 
       } 
       catch (Exception ex) 
       { 
        logger.error(ex.getMessage()); 
       } 
     } 

    }// end loadxlsxFile 
    public String getNumberOfColumns() throws Exception 
    { 
     int NO_OF_Column=0; XSSFCell cell = null; 
     loadXlsxFile(); 
     Iterator rowIter = sheet.rowIterator(); 
     XSSFRow firstRow = (XSSFRow) rowIter.next(); 
     Iterator cellIter = firstRow.cellIterator(); 
      while(cellIter.hasNext()) 
      { 
        cell = (XSSFCell) cellIter.next(); 
        NO_OF_Column++; 
      } 

     return NO_OF_Column+""; 
    } 

} 

} 

コードです通常のjavaファイルを実行するとコードが正常に動作するため、問題が発生します。

答えて

1

通常、システムクラスローダーを使用するのはなぜですか?

しかし、あなたはまだ、その後これを見..

を使用すると、Webアプリケーションのように使用しているとして使用したい場合。その場合は、次のように得られるClassLoaderを使用する必要があります。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

この1つは、問題のwebアプリケーションに関連付けられたすべてのクラスパス・パスへのアクセス権を持っており、あなたは(これは、親クラスローダにもう依存しませんよwebappに複数のものがあります!)がクラスをロードしました。

次に、このクラスローダーでは、getResourceAsStream()を呼び出してクラスパスリソースをストリームとして取得するだけで、Webアプリケーションの起動方法に依存するgetSystemResourceAsStream()ではなくストリームとして取得する必要があります。ファイルの

InputStream input = classLoader.getResourceAsStream("filename.extension"); 

場所べきあなたのCLASSPATHに:あなたは、外部のホスティングでは、それを制御することはできませんので、あなたにもその依存になりたくありません。

関連する問題