在Web应用程序中生成Excel工作表的问题

时间:2015-07-09 16:44:26

标签: java multithreading spring spring-mvc

在Web应用程序中工作时,根据结果生成excel表存在一些问题。对于每个请求,此Excel表单数据应该是独立的。截至目前,我已通过以下方式实施:

为excel配置创建了一个xml文件

spring-excel-views.xml
<bean id="excelView" class="com.test.service.excelService"

I have configure this xml in the servlet configuration file
<bean class="xmlReolver> //Mentioned clearly in the code but not here
  <property name="location>
     <value>bin/spring-excel-views.xml</value>
  </property>
</bean>

现在我有控制器类和Utility类 UtiilityClass:计算结果并发送回Controller

Controller: model.addAttribute("result", result); //Assuming result  is  coming for Utility class

现在excelService.java的编码如下:

class ExcelService implements AbstractExcelView{



 @overridden
    protected void buildExcelDocument(Map model,HttpServletRequest req, HTTPServletResponse res){
    Map m = model.getResults("results"); // Picking this from Controller
    for(Map.Entry<Integer,String> entry: m.entrySet()){ -->Exception is throwing
//excel sheet logiic
}
    //iteration logic  ----> Exception thrown here
    }
    }

这里有时excel表成功生成,有时在开始迭代之前抛出 Nullpointerexception 。此excel数据也会覆盖其他一些请求数据。显示的结果很好,但我遇到了Excel工作表数据的问题。

帮我解决这个问题。

异常堆栈跟踪

Exception  Report:
type Exception report
message Request processing failed; nested exception is java.lang.NullPointerException
description: The server encountered an internal error that prevented it from fulfilling this request.
exception:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.
org. springframework. web. servlet. FrameworkServlet . processRequest (FrarneworkServlet. java: 932)
org.springframework.web.servlet.FrameworkServlet.doGet(Frameworkservlet.java:816)
javax.servlet.http.HttpServlet.service (HttpServlet.java: 620)
org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:801)
javax.servlet.http.Httpservlet.service(Httpservlet.java:727)
root cause

java.lang.NullPointerException
com. hello. services.ExcelService.buildExcelDocument (Excelservice.java:34)
org. springframework.web.servlet.view.document.AbstractExcelView.renderMergedoutputModel (AbstractE
org.springfranework.web.servlet.view.AbstractView.render (AbstractView.java:264)
org.springframework.web.servlet.DispatcherServlet.render (Dispatcherservlet.java: 1208)
org. springframework . web . serviet . DispatcherServlet . processDispatchResult (DispatcherServlet . java: 1208
org. springframework. web. servlet . DispatcherServlet . doDispatch (DispatcherServlet . java: 939)
org. springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:856)
org. springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java: 920)
org. springframework.web.servlet.FrameworkServlet.doGet (FrameeworkServlet.java:816)
javax.servlet.http.Httpservlet.service(Httpservlet.java: 620)
org.springframework.web.servlet.FrameworkServlet.service (FraneworkServlet.java:801)
javax.servlet.http.HttpServlet.service(Httpservlet.java:727)

1 个答案:

答案 0 :(得分:0)

正如你所指出的那样,异常就是在下面的行中抛出

  

for(Map.Entry entry:m.entrySet()){ - &gt;异常抛出

你得到这个异常,因为model.getResults(“results”)返回null。那么你的 m 被赋值为null并且在空引用上执行m.entrySet()这就是抛出空指针异常

所以你必须弄清楚为什么model.getResults(“results”)返回null并修复它。如果可能出现没有生成Excel工作表的情况,则model.getResults(“results”)将返回nulll。然后你必须在你的代码中提供适当的检查。这是一个检查,但它可能还不够,因为你可以处理更多的东西。

if(m!=null){
  for(Map.Entry<Integer,String> entry: m.entrySet()){ -->Exception is throwing
    //excel sheet logiic
  }
  //iteration logic  ----> Exception thrown here
}

关于你关于线程安全的问题,它完全取决于你如何设计你的类并使用它,这很难通过查看几行来回答。但是,这可能不是线程安全的问题。