我明白了
javax.servlet.ServletException: BeanUtils.populate: NullPointerException
当我打开页面一段时间(约30分钟),然后点击“提交”#39;我页面上的按钮。我在StackOverflow和Googled上看过几篇关于索引的帖子,我经历过它们,试图理解和实现,但似乎没有任何帮助。这是错误截图:
HTTP Status 500 - BeanUtils.populate
type Exception report
message BeanUtils.populate
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1254)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:821)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.lang.NullPointerException
org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:515)
org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:428)
org.apache.commons.beanutils.PropertyUtils.getNestedProperty(PropertyUtils.java:770)
org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:801)
org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:881)
org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808)
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1252)
org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:821)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
private PhaseTrackerSelectApprInfo[] selectApprList;
public PhaseTrackerSelectApprInfo[] getSelectApprList() {
return selectApprList;
}
public void setSelectApprList(PhaseTrackerSelectApprInfo[] selectApprList) {
this.selectApprList = selectApprList;
}
private String dbName;
private String schemaName;
private String serviceName;
private String action;
private String phase2MoveDate;
private String approverProfileId;
private ArrayList approverList;
public String getDbName() {
return dbName;
}
public void setDbName(String dbName) {
this.dbName = dbName;
}
public ArrayList getApproverList() {
return approverList;
}
public void setApproverList(ArrayList approverList) {
this.approverList = approverList;
}
public String getApproverProfileId() {
return approverProfileId;
}
public void setApproverProfileId(String approverProfileId) {
this.approverProfileId = approverProfileId;
}
public String getSchemaName() {
return schemaName;
}
public void setSchemaName(String schemaName) {
this.schemaName = schemaName;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getPhase2MoveDate() {
return phase2MoveDate;
}
public void setPhase2MoveDate(String phase2MoveDate) {
this.phase2MoveDate = phase2MoveDate;
}
<logic:iterate id="selectApprList" name="phaseTrackerForm" indexId="i" property="selectApprList" type="com.cisco.rdac.info.PhaseTrackerSelectApprInfo">
<bean:define id="myOptions" name="selectApprList" property="approverList" type="java.util.Collection"/>
<tr>
<td >
<bean:write name="selectApprList" property="dbName"/>
</td>
<td >
<bean:write name="selectApprList" property="schemaName"/>
</td>
<td >
<bean:write name="selectApprList" property="serviceName"/>
</td>
<logic:equal name="moveTo" value="phase2" >
<td>
<bean:write name="selectApprList" property="action"/>
</td>
<td>
<logic:empty name="selectApprList" property="phase2MoveDate">
N/A
</logic:empty>
<logic:notEmpty name="selectApprList" property="phase2MoveDate">
<bean:write name="selectApprList" property="phase2MoveDate"/>
</logic:notEmpty>
</td>
</logic:equal>
<td >
<html:select indexed="true" name="selectApprList" property="approverProfileId" style="font-size: 90%;">
<html:options collection="myOptions" property="value" labelProperty="label" />
</html:select>
</td>
</tr>
</logic:iterate>
<action
name="phaseTrackerForm"
path="/phaseTracker"
scope="session"
parameter="methodToCall"
validate="true"
input="/WEB-INF/pages/jsp/phaseTrackerInfoPage.jsp"
type="com.test.actions.PhaseTrackerAction">
<forward name="phaseTrackerRequest" path="/WEB-INF/pages/jsp/phaseTrackerInfoPage.jsp" />
<forward name="phaseTrackerSelectAppr" path="/WEB-INF/pages/jsp/phaseTrackerSelApprPage.jsp" />
<forward name="sameApprover" path="/WEB-INF/pages/jsp/phaseTrackerSelSameApprPage.jsp" />
<forward name="phaseTrackerSubmit" path="/WEB-INF/pages/jsp/phaseTrackerSubmittedPage.jsp" />
</action>
我理解索引getter和setter,但selectApprList
是logic:iterate
标记和PhaseTrackerSelectApprInfo
数组的ID。我认为这个数组类型应该可以工作,但无论如何我都会得到错误。我是 Struts 的新手并且正在维护此代码,因此无法进行任何重大更改。
不知道我错过了什么。任何帮助表示赞赏。
答案 0 :(得分:0)
selectApprList is the id of logic:iterate tag
。并不重要,但重要的是它是select
标记的名称。看看你的代码,我找不到这个属性的getter和/或它所包含的对象的getter。
您可以找到here的类似问题。
现在的问题是,新实例是否准备好处理设置 您的ArrayList字段上的值? Struts不会实例化该列表 对你来说,它不会知道如何。所以确保Struts时 访问你的ActionForm,ArrayList已经存在。