【问题标题】:Exception when submitting a page containing <s:select>提交包含 <s:select> 的页面时出现异常
【发布时间】:2019-10-31 01:01:00
【问题描述】:

我正在使用 Struts2 进行项目。在那里,有一个动态下拉菜单。每当我选择值并提交页面时,我都会遇到异常。我尝试了一些替代方案,但对我没有任何效果。下面是异常堆栈跟踪。

SEVERE: Servlet.service() for servlet jsp threw exception
tag 'select', field 'list', name 'locname': The requested list key 'requestListLocationInfo' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
    at org.apache.struts2.components.Component.fieldError(Component.java:260)
    at org.apache.struts2.components.Component.findValue(Component.java:356)
    at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:84)
    at org.apache.struts2.components.Select.evaluateExtraParams(Select.java:104)
    at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:886)
    at org.apache.struts2.components.UIBean.end(UIBean.java:535)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
    at org.apache.jsp.AddReader_jsp._jspx_meth_s_005fselect_005f0(AddReader_jsp.java:592)
    at org.apache.jsp.AddReader_jsp._jspx_meth_s_005fform_005f0(AddReader_jsp.java:426)
    at org.apache.jsp.AddReader_jsp._jspService(AddReader_jsp.java:332)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
    at org.apache.struts2.result.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:173)
    at org.apache.struts2.result.StrutsResultSupport.execute(StrutsResultSupport.java:208)
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:253)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:260)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:52)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.doIntercept(ConversionErrorInterceptor.java:139)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:134)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:134)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:199)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:69)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:115)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:88)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:246)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:139)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:157)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:174)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:123)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:171)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:201)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:193)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:247)
    at org.apache.struts2.factory.StrutsActionProxy.execute(StrutsActionProxy.java:53)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:577)
    at org.apache.struts2.dispatcher.ExecuteOperations.executeAction(ExecuteOperations.java:81)
    at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:143)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

JSP 代码

                        <s:if test="hasActionMessages()">
                            <div class="welcome">
                                <s:actionmessage />
                            </div>
                        </s:if>
                        <s:elseif test="hasActionErrors()">
                            <div class="errors">
                                <s:actionerror />
                            </div>
                        </s:elseif>
                        <div id="myDIV" style="margin-top: 8%; margin-left: 25%;">

                            <label>Reader IP:</label>&nbsp <input type="text" name="readerIp" id="readerIp" required>&nbsp &nbsp &nbsp <br> 
                            <label>Antenna ID:</label>&nbsp <input type="text" name="antennaId" id="antennaId" required>&nbsp
                            &nbsp &nbsp <br> <label>Select Gate:</label>&nbsp
                                <s:select id="locname" name="locname" list = "requestListLocationInfo" listKey = "locId" listValue = "locname" headerKey = "-1" headerValue = "Select Gate" />
                            <br>
                            <button class="btn" id="newBtn"
                                style="margin-top: 2%; margin-left: 17%; width: 17%; text-decoration: none;"
                                onclick="clickedMe(this.id)">Add</button>
                        </div>
                    </s:form>


Action类中的方法:

    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String addReaderConfig() {
        HttpServletRequest req = ServletActionContext.getRequest();
        try {
            String locName = req.getParameter("newButton");
            int locationid = Integer.parseInt(locName);
            String readerIp = req.getParameter("readerIp");
            String antenaID = req.getParameter("antennaId");
            int antennaId = Integer.parseInt(antenaID);
            String created_by = req.getParameter("created_by");
            String company_id = (String)         ActionContext.getContext().getSession().get("company_id");
            int companyId = Integer.parseInt(company_id);
            int i = ChartDAO.addReader(readerIp, antennaId, locationid, companyId, created_by);
            if (i > 0) {
                msg = Constants.READER_ADDED_SUCCESSFULLY;
                addActionMessage(msg);
            } else {
                msg = Constants.READER_ADDING_FAILED;
                addActionError(msg);
                return Constants.ERROR;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Constants.ERROR;
        }
        return Constants.SUCCESS;
    }

POJO

private int locId;
private String locname;
private List < ChartPOJO > requestListLocationInfo = null;
public String getLocname() {
    return locname;
}
public void setLocname(String locname) {
    this.locname = locname;
}
public int getLocId() {
    return locId;
}
public void setLocId(int locId) {
    this.locId = locId;
}
public List < ChartPOJO > getRequestListLocationInfo() {
    return requestListLocationInfo;
}
public void setRequestListLocationInfo(List < ChartPOJO > requestListLocationInfo) {
    this.requestListLocationInfo = requestListLocationInfo;
}

DAO 类中的方法

public static int addReader(String readerIp, int antennaId, int locId, int company_id, String created_by) {
    int status = 0;
    String driverClass = Constants.DB_Driver;
    Class.forName(driverClass);
    String url = Constants.DB_Address;
    String username = Constants.DB_Username;
    String password = Constants.DB_Password;
    try (Connection conn = DriverManager.getConnection(url, username, password);) {
        try (PreparedStatement ps1 = conn.prepareStatement("select locationid,loc_name from locations where locationid=?");) {
            ps1.setInt(1, locId);
            try (ResultSet rs2 = ps1.executeQuery();) {
                if (!rs2.next()) {
                    String query = "INSERT INTO reader(ipaddress,antenaid,companyid,locationid,status,created_by,created_date) values(?,?,?,?,?,?,?)";
                    try(PreparedStatement ps = conn.prepareStatement(query);) {
                        ps.setString(1, readerIp);
                        ps.setInt(2, antennaId);
                        ps.setInt(3, company_id);
                        ps.setInt(4, locId);
                        ps.setInt(5, 1);
                        ps.setString(6, created_by);
                        LocalDateTime now = LocalDateTime.now();
                        System.out.println("Before : " + now);
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        String formatDateTime = now.format(formatter);
                        System.out.println("After : " + formatDateTime);
                        ps.setString(7, formatDateTime);
                        status = ps.executeUpdate();
                        System.out.println("after adding reader successfully");
                    }
                } else {
                    System.out.println("location already exists");
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        e.getMessage();
        return status;
    }
    return status;
}


我可以知道这个异常的原因以及如何解决它。提前致谢。

【问题讨论】:

标签: java jsp jakarta-ee struts2


【解决方案1】:

您必须删除 listKey 或在项目中某处的选择字段中解决它。

您的日志抱怨 requestListLocationInfo 列表可能没有正确的 listKey 值或空值

【讨论】:

  • 我尝试删除 listKey 并检查但异常相同。
  • 让我们尝试模拟 listKey 或检查 select 中的一些值是否为空
  • 我试图检查列表是否为空,但得到了同样的异常
  • 逐点检查所有属性并逐一检查表单元素您的问题来自空值
  • 嗨@xargr,我已经检查了表单中的所有属性,一切都正确
猜你喜欢
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2014-03-21
  • 1970-01-01
相关资源
最近更新 更多