记一次500 Unable to instantiate Action错误(2011-2-27)
今天周末,但是项目快要进入UAT,所以项目组的几位哥们都自发的去公司加班,因为bug有一堆需要解决,才到公司打开skype,身在旧金山的D哥就发过来一封Email说才部署到客户那边的一个新功能有问题,这个功能我也参与其中,所以便义不容辞的要拿下来了.
首先简单的介绍一下,项目采用的是Struts2.0.14 + Hibernate 3.2.6 ga + Spring 2.5.6作为各层的实现,表现层大量使用了Extjs.
从Email上的截图可以看到错误时一个弹出框,根据上面的提示信息搜了一下code,发现是发送一个Ajax请求时对应的action发生错误,但是苦于今天的VPN网络速度实在是太慢,完全登陆不上客户那边进行详细的查看,正好QA说本地也能重现该错误,那OK,在本地起个server来看看.
但是清晰的记得在上code之前,在本地是做过测试的,不会有这个问题,先暂且看看再说。
server一起来,拿了一个符合条件的数据进行测试,哎,还真有这错,通过Firebug进行详细的查看,有如下错误信息:
Unable to instantiate Action, reportCbxReportAction, defined for 'reportGenCbxReport' in namespace '/'Error creating bean with name 'reportCbxReportAction' defined in file [C:\cvs\project\target\classes\spring\actionContext.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'defaultReportName' threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 1
<bean id="reportCbxReportAction" scope="prototype" value="${cbxReport.defaultReportName}"/> </bean>
cbxReport.defaultReportName=MARKET_PO_SUMMARY_V001-[Curr_Date_YYMMDD],PO_PREPACK_V001-[Curr_Date_YYMMDD],TICKET_PO_V001-[Curr_Date_YYMMDD]
private final Map<String,String> defaultFileNames = new HashMap<String, String>(); public void setDefaultReportName(final String defaultReportName) { this.defaultReportName = defaultReportName; if(defaultFileNames.size() == 0){ final String[] defaultFileNameArray = defaultReportName.split(","); for(final String s : defaultFileNameArray){ final String[] temp = s.split(":"); this.defaultFileNames.put(temp[0], temp[1]); } } }
cbxReport.defaultReportName=PO-SUMMARY:MARKET_PO_SUMMARY_V001-[Curr_Date_YYMMDD],PO-PACK:PO_PREPACK_V001-[Curr_Date_YYMMDD],PO-TICKET:TICKET_PO_V001-[Curr_Date_YYMMDD]