【问题标题】:Error HTTP 500- javax.servlet.ServletException: BeanUtils.populate: NullPointerException错误 HTTP 500 - javax.servlet.ServletException: BeanUtils.populate: NullPointerException
【发布时间】:2017-04-07 00:00:51
【问题描述】:

我明白了

javax.servlet.ServletException: BeanUtils.populate: NullPointerException

当我将页面打开一段时间(大约 30 分钟)然后单击页面上的“提交”按钮时。我在 StackOverflow 和 Google 上看到了一些关于 Indexing 的帖子,我浏览了它们,试图理解和实施,但似乎没有任何帮助。这是错误截图:

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)

FORM (PhaseTrackerForm.java):

private PhaseTrackerSelectApprInfo[] selectApprList;

public PhaseTrackerSelectApprInfo[] getSelectApprList() {
     
    return selectApprList;
}

public void setSelectApprList(PhaseTrackerSelectApprInfo[] selectApprList) {
    this.selectApprList = selectApprList;
     
}

表格(PhaseTrackerSelectApprInfo):

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;
}

JSP 代码:

<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>

struts-config.xml 映射:

<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,但 selectApprListlogic:iterate 标记和 PhaseTrackerSelectApprInfo 数组的 id。我认为这个数组类型应该可以工作,但我还是得到了错误。我正在使用 Struts 并致力于维护此代码,因此无法进行任何重大更改。

【问题讨论】:

    标签: java jsp struts apache-commons-beanutils


    【解决方案1】:

    selectApprList is the id of logic:iteratetag, but it matters that it's a name of` 标签无关紧要。查看您的代码,我没有找到该属性的 getter 和/或它包含的对象的 getter。

    您可以找到类似的问题:

    现在的问题是,新实例是否准备好处理设置 ArrayList 字段上的值? Struts 不会实例化该列表 对你来说,它不知道该怎么做。所以确保当 Struts 访问您的 ActionForm,ArrayList 已经存在。

    你可以找到example如何使用&lt;logic:iterate&gt;标签。

    【讨论】:

    • 我为 selectApprList in PhaseTrackerForm 添加了 getter 和 setter。此外,数组内的内容的 getter 和 setter 也在PhaseTrackerSelectApprInfo 中。我尝试将索引放入 selectApprList 的 getter/setter 参数中,但它会产生编译错误,因为它返回数组类型。请让我知道我错过了什么。
    • 我在PhaseTrackerForm 中为数组添加了一个初始化为private PhaseTrackerSelectApprInfo[] selectApprList=new PhaseTrackerSelectApprInfo[0];,但现在我得到的是ArrayIndexOutOfBoundsException,而不是NullPointerException
    • 如果我的会话超时为 -1 或在给定值内提交,一切似乎都正常。如果超过该值(比如 30 分钟),然后我单击“提交”按钮,则会引发此错误。
    • ArrayList 的值应该在会话范围内重新填充。
    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多