【问题标题】:ParametersInterceptor error: Unexpected Exception caught, Error setting expressionParametersInterceptor error: Unexpected Exception catched, Error setting expression
【发布时间】:2015-01-05 11:31:06
【问题描述】:

我在表单中有一个表格,其中包含下拉菜单和隐藏的input

JSP:

<form action="modifyfaculty" method="post">
    <table>
        <thead class="center">
            <tr>
                <!-- column names here -->
            </tr>
        </thead>

        <tbody>
            <c:forEach var="professor" items="${facultyList}">
                <tr>
                    <!-- more <td> -->

                    <td align="center">
                        <c:choose>
                            <c:when test="${professor.profEmplStatus.equals('FULL')}">
                                <select name="profEmplStatus" required>
                                    <option value="FULL" selected>FULL</option>
                                    <option value="PART">PART</option>
                                    <option value="RET">RET</option>
                                    <option value="TRMTD">TRMTD</option>
                                </select>
                            </c:when>

                            <!-- more <c:when> blocks -->
                        </c:choose>
                    </td>

                    <td align="center">
                        <c:choose>
                            <c:when test="${professor.profDept.equals('BSCS-SE')}">
                                <select name="profDept" required>
                                    <option value="BA-MMA">BA-MMA</option>
                                    <option value="BFDT">BFDT</option>
                                    <option value="BS-AN">BS-AN</option>
                                    <option value="BS-GPD">BS-GPD</option>
                                    <option value="BSBA-FM">BSBA-FM</option>
                                    <option value="BSBA-MKT">BSBA-MKT</option>
                                    <option value="BSCS-SE" selected>BSCS-SE</option>
                                    <option value="BSIT-WD">BSIT-WD</option>
                                    <option value="GENED">GENED</option>
                                </select>
                            </c:when>

                            <!-- more <c:when> blocks -->
                        </c:choose>
                    </td>

                    <td class="center">
                        <input type="hidden" name="profId" value="${professor.profId}" />
                        <input type="submit" value="Save" />
                    </td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
</form>

ModifyFacultyAction:

public class ModifyFacultyAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    private Integer profId;
    private String profEmplStatus;
    private String profDept;

    @Override
    public String execute() {
        FacultyManager fm = new FacultyManager();
        fm.modifyFaculty("professor_employment_status", profEmplStatus, profId);
        fm.modifyFaculty("professor_department", profDept, profId);

        return SUCCESS;
    }

    public Integer getProfId() {
        return profId;
    }

    public void setProfId(Integer profId) {
        this.profId = profId;
    }

    public String getProfEmplStatus() {
        return profEmplStatus;
    }

    public void setProfEmplStatus(String profEmplStatus) {
        this.profEmplStatus = profEmplStatus;
    }

    public String getProfDept() {
        return profDept;
    }

    public void setProfDept(String profDept) {
        this.profDept = profDept;
    }
}

struts.xml:

<action name="modifyfaculty" class="com.mypackage.action.ModifyFacultyAction">
    <interceptor-ref name="notauth" />
    <interceptor-ref name="defaultStack" />

    <result type="redirectAction">
        <param name="actionName">viewfaculty</param>
    </result>

    <result name="input" type="redirectAction">
        <param name="actionName">viewfaculty</param>
    </result>

    <result name="index" type="redirect">/index.jsp</result>
</action>

输出:

但是,在从下拉列表中选择新值并单击 Save 时,我收到错误消息。以下是devMode 日志:

Jan 05, 2015 11:34:43 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error
SEVERE: Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'profId' on 'class com.mypackage.action.ModifyFacultyAction: Error setting expression 'profId' with value ['100005', '100006', '100007', '100008', '100009', '100010', '100011', ]
Jan 05, 2015 11:34:43 PM com.opensymphony.xwork2.util.LocalizedTextUtil warn
WARNING: Missing key [invalid.fieldvalue.profId] in bundles [[org/apache/struts2/struts-messages, com/opensymphony/xwork2/xwork-messages]]!

如何解决?

【问题讨论】:

  • input结果和一些标签(actionerror/fielderror)添加到jsp以查看错误。
  • 我添加了&lt;result name="input"&gt;,但它必须重定向到另一个操作(type="redirectAction")来呈现所需的JSP,所以我看不到字段错误消息。
  • 所以不要重定向。打开开发模式。
  • 至少,我已经将原因缩小到单击Save 时提交的表单7 次(教授/数据库条目的数量),因为整个表都在表单内。我仍然不确定如何实现预期目标。
  • 您想一次保存整个表格吗?如果没有,则创建单独的表单或其他任何内容。

标签: java html jsp parameters struts2


【解决方案1】:

您不需要提交表格的所有个ID。因为您不想将profId 转换为列表或数组。为每条记录使用单独的表格。

<table>
    <thead class="center">
        <tr>
            <!-- column names here -->
        </tr>
    </thead>

    <tbody>
        <c:forEach var="professor" items="${facultyList}">
          <tr><td>
          <form action="modifyfaculty" method="post">
          <table>
            <tr>
                <!-- more <td> -->

                <td align="center">
                    <c:choose>
                        <c:when test="${professor.profEmplStatus.equals('FULL')}">
                            <select name="profEmplStatus" required>
                                <option value="FULL" selected>FULL</option>
                                <option value="PART">PART</option>
                                <option value="RET">RET</option>
                                <option value="TRMTD">TRMTD</option>
                            </select>
                        </c:when>

                        <!-- more <c:when> blocks -->
                    </c:choose>
                </td>

                <td align="center">
                    <c:choose>
                        <c:when test="${professor.profDept.equals('BSCS-SE')}">
                            <select name="profDept" required>
                                <option value="BA-MMA">BA-MMA</option>
                                <option value="BFDT">BFDT</option>
                                <option value="BS-AN">BS-AN</option>
                                <option value="BS-GPD">BS-GPD</option>
                                <option value="BSBA-FM">BSBA-FM</option>
                                <option value="BSBA-MKT">BSBA-MKT</option>
                                <option value="BSCS-SE" selected>BSCS-SE</option>
                                <option value="BSIT-WD">BSIT-WD</option>
                                <option value="GENED">GENED</option>
                            </select>
                        </c:when>

                        <!-- more <c:when> blocks -->
                    </c:choose>
                </td>

                <td class="center">
                    <input type="hidden" name="profId" value="${professor.profId}" />
                    <input type="submit" value="Save" />
                </td>
            </tr>
           </table>
          </form>
         </td></tr>
        </c:forEach>
    </tbody>
</table>

【讨论】:

  • 嗨,来自this thread,它说您不能在&lt;tbody&gt; 中包含&lt;form&gt;
  • 如果您可以在 Quentin 的解决方案中包含一个示例,我很乐意在这里接受答案并将该线程链接到此帖子(因为这似乎是一个热门问题)。 =)
  • 这是不同的问题,更有可能是页面设计,请在另一篇文章中提问。您当然可以链接到这个问题。而且您应该知道,如果此答案对您有用,则应将其标记为已接受的答案。
  • 这将导致表格不描述实际数据结构并且彼此不对齐。最好使用我在链接到问题中描述的方法。
  • 嗨@Quentin,是的,它有未对齐的单元格,正如您在上面的几个 cmets 的屏幕截图中看到的那样(尽管我将其保留为已接受的答案,因为它回答了有关功能的原始问题)。如果您可以将示例代码 sn-p 放在另一个线程的原始答案中,那将很有帮助。
猜你喜欢
  • 2022-12-28
  • 2016-06-17
  • 2015-10-24
  • 2014-06-27
  • 1970-01-01
  • 2016-10-21
  • 2019-06-13
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多