我希望使用gwt RPC读取xls文件,当我使用的代码在普通文件中使用时,它无法加载文件并给我空指针异常。
以下是代码 { {
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+"";
}
}
}
我通过以下代码在客户端程序中调用它:
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){}
}
请告诉我如何解决此问题,因为代码在正常的java文件中运行时运行良好。
答案 0 :(得分:1)
为什么使用系统类加载器而不是正常的?
但是,如果你还想使用,请看看这个..
正如您在使用Web应用程序一样。在这种情况下,您需要使用获得的ClassLoader
,如下所示:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
这个可以访问与所讨论的webapplication相关联的所有类路径路径,并且您不再依赖于哪个父类加载器(一个webapp有多个!)已经加载了您的类。
然后,在这个类加载器上,你需要调用getResourceAsStream()来获取类路径资源作为流,而不是getSystemResourceAsStream(),这取决于web应用程序的启动方式。您不希望依赖于此,因为您无法在外部托管中对其进行控制:
InputStream input = classLoader.getResourceAsStream("filename.extension");
文件的位置应在CLASSPATH
中。