如何在BaseCommandController.bindAndValidate中的某处调试NumberFormatException

时间:2013-08-08 08:19:34

标签: java spring spring-mvc

我是SpringFramework的新手。 我创建了一个扩展SimpleFormController的控制器。我还创建了一个命令类,它有几个String字段和两个List<String>字段。

表单位于PHP生成的页面上,之前由PHP执行。我正在尝试将该处理转移到Java,因为这部分应用程序正在生成大型电子表格,而PHP无法再处理这些电子表格。

无论如何,表单不包含任何数字字段。不过,当我提交表单时,我得到NumberFormatException:

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NumberFormatException: For input string: ""
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
root cause

java.lang.NumberFormatException: For input string: ""
    java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    java.lang.Integer.parseInt(Integer.java:504)
    java.lang.Integer.parseInt(Integer.java:527)
    org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:991)
    org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:924)
    org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)
    org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:692)
    org.springframework.validation.DataBinder.doBind(DataBinder.java:588)
    org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:191)
    org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:112)
    org.springframework.web.servlet.mvc.BaseCommandController.bindAndValidate(BaseCommandController.java:394)
    org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:266)
    org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

堆栈跟踪不包含任何类,我不知道如何调试它。

这是我的命令类:

public class ExportCommand {
    private String ifs_login;
    private String exp_sales_price_group_id_sp_ip_pl;
    private List<String> exp_catalog_group;
    private List<String> exp_vendor_no_pps;
    private String exp_price_list_no_pl;
    private String exp_contract;
    private String exp_language_code_spl;
    private String exp_active_ind_sp = ""; //those are checkboxes with "Y" as checked value, so I initialize them to empty strings if they are unchecked. 
    private String exp_desc = "";
    private String exp_customs = "";
    private String exp_ordered = "";

//here goes default getters and setters
}

以下是我在Chrome开发者工具中看到的表单:

ifs_test:MAGE
exp_sales_price_group_id_sp_ip_pl:MOLEX
exp_catalog_group[]:
exp_price_list_no_pl:MOLEX
exp_contract:VER
exp_language_code_spl:

......以及它的来源形式:

ifs_test=MAGE&exp_sales_price_group_id_sp_ip_pl=MOLEX&exp_catalog_group%5B%5D=&exp_price_list_no_pl=MOLEX&exp_contract=VER&exp_language_code_spl=

编辑:

我的控制器看起来像这样:

public class ExportController extends org.springframework.web.servlet.mvc.SimpleFormController {

    @Override
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
         //....
    }
}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我找到了答案。问题是我试图直接使用PHP表单而不做任何修改。只有在输入或选择框的名称中有[]后缀时,PHP才会处理表单中的数据数组。它们当然可以在方括号中包含索引,如field[1]field[some_text_index],但通常括号都是空白的,这就是我的情况。

Spring似乎试图将'exp_catalog_group []'字段名称映射到List<String> exp_catalog_group字段的名称,并试图从sqare括号中提取索引。对于List,此索引应为Integer,但它是空字符串。

我不得不将系统PHP部分的<select>名称更改为exp_catalog_group,现在它正在运行。

愚蠢的初学者错误:))

答案 1 :(得分:0)

您的NumberFormatException尝试将空字符串""变为Integer。在抛出异常时设置一个断点,然后沿堆栈跟踪向上走,看看是什么尝试设置的。特别是,BeanWrapperImpl的堆栈变量可能会告诉您异常发生时正在处理的目标属性。

最有可能的是,你正在让Spring试图自动地将包含String的某些数据格式调整到相应字段类型为Integer的某些内容中,并且它丢失了,无论是作为错误还是作为错误可选值。发生此错误时,您尝试访问的控制器方法的签名是什么?

相关问题