最近项目出现一段不影响项目运行的异常,但在控制台出现这堆异常让我很不爽,结果我用debug调试 找不到这个异常倒地为啥出现。个人觉得要解决这堆异常必须挖熟spring mvc 原理 才能解决
我用的是spring2.5 mvc 框架。大体说下这个异常的的由来,希望有牛人帮忙解决下。
步骤1、在前段jsp页面发送一个请求"/dangyuan/editView.do" 请求被传送到一个controller 接管。Java code    @RequestMapping(value = "/dangyuan/editView.do", method = RequestMethod.GET) public void showEidtView(@RequestParam("id") Long id, Model model) { DangyuanEditForm form = new DangyuanEditForm(); model.addAttribute("dangweis", dangweiService.getAllDangweis()); Dangyuan dangyuan = dangyuanService.getDangyuanById(id); Dangyuan showDy = dangyuanService.breedDy(dangyuan); model.addAttribute("dangyuan", showDy); model.addAttribute("hdy", dangyuan); BeanUtils.copyProperties(dangyuan, form); form.setId(null); model.addAttribute("form", form); }
步骤2、我debug 调试 当从这段代码出去后就抛了异常
步骤3、然后会进入到jsp页面 。 页面代码省略
步骤4、在jsp页面提交form表单后 请求被下面这段代码接收。Java code    @RequestMapping(value = "/dangyuan/editView.do", method = RequestMethod.POST) public String onSubEditView(@ModelAttribute("form") DangyuanEditForm form, Model model) { dangyuanService.editDangyuanEditForm(form); return "redirect:/dangyuan/view.do?id=" + form.getId(); }这几段代码让我很郁闷:
1、首先遇到了异常
2、我在showEidtView 中明明把form对象中的id设为null了,结果在 onSubEditView 中 form竟然有Id了。 我查了我的jsp文件 上面没有给form的Id赋值。我查了 网上关于spring mvc 的讲解 有了个大概了解。但是 就是不知道 spring 在我这几段代码中间 做了什么手脚 导致 产生 上面两个问题。
我所了解的spring mvc 就这样了 知道很多人不喜欢看大把的异常和 大把的代码 所以 把个人认为无关紧要的 异常 和代码贴后面 

解决方案 »

  1.   

    spring最重要的就是用了java的映射,他将所有的java类都管理起来,你看,只要看他的映射点是否正确就可以了,
      

  2.   

    附件1、那个可恶的异常,贴最上面的那段
    Servlet.service() for servlet xjtuomst threw exception
    java.lang.NumberFormatException: For input string: "undefined"
            at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
            at java.lang.Long.parseLong(Long.java:403)
            at java.lang.Long.valueOf(Long.java:518)
            at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:160)
            at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:114)
            at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:382)
            at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:358)
            at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:173)
            at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:107)
            at org.springframework.beans.SimpleTypeConverter.convertIfNecessary(SimpleTypeConverter.java:47)
      

  3.   

    其实 也常也就罢了。 我关键是想知道 spring 对我的程序做了什么手脚。这是我最关心的。
    jsp 页面form 代码 
    <form:form modelAttribute="form">
    <table class="font12" width="100%" border="0" cellspacing="0">
    <tr>
    <td width="15%" align="right">
    姓名:
    </td>
    <form:hidden path="name" />
    <td width="23%">
    ${dangyuan.name}
    </td>
    <td width="12%" align="right">
    学号/工号:
    </td>
    <form:hidden path="numbers" />
    <td width="50%">
    ${dangyuan.numbers}
    </td>
    </tr>
    <tr>
    <td align="right">
    性别:
    </td>
    <form:hidden path="sex" />
    <td>
    ${dangyuan.sex}
    </td>
    <td align="right">
    出生日期:
    </td>
    <form:hidden path="birthDate" />
    <td>
    <fmt:formatDate value="${dangyuan.birthDate}" />
    </td>
    </tr>
    <tr>
    <td width="15%" align="right">
    籍贯:
    </td>
    <form:hidden path="jiguan" />
    <td width="23%">
    ${dangyuan.jiguan}
    </td>
    <td width="12%" align="right">
    民族:
    </td>
    <form:hidden path="nation" />
    <td width="50%">
    ${dangyuan.nation}
    </td>
    </tr>
    <tr>
    <td align="right">
    学历:
    </td>
    <form:hidden path="xueli" />
    <td>
    ${dangyuan.xueli}
    </td>
    <td align="right">
    学位:
    </td>
    <form:hidden path="degree" />
    <td>
    ${dangyuan.degree}
    </td>
    </tr>
    <tr>
    <td align="right">
    工作单位:
    </td>
    <form:hidden path="yuanUnit" />
    <td>
    ${dangyuan.yuanUnit }
    </td>
    <td align="right">
    参加工作时间:
    </td>
    <form:hidden path="workDate" />
    <td>
    <fmt:formatDate value="${dangyuan.workDate}" />
    </td>
    </tr>
    <tr>
    <td align="right">
    职称:
    </td>
    <form:hidden path="zhicheng"/>
    <td>
    ${dangyuan.zhicheng }
    </td>
    <td align="right">
    毕业时间:
    </td>
    <form:hidden path="graduateDate" />
    <td>
    <fmt:formatDate value="${dangyuan.graduateDate}" />
    </td>
    </tr>
    <tr>
    <td align="right">
    学生/教职工:
    </td>
    <form:hidden path="peopleType"/>
    <td>${dangyuan.peopleType=='1' ? '学生' : '教职工'}</td>
    <td align="right">
    <font color="red">政治面貌:</font>
    </td>
    <td>
    <select name="zhengzhiMianmao">
    <c:forEach items="${dangCodes }" var="item">
    <c:choose>
    <c:when test="${item.code eq hdy.zhengzhiMianmao }">
    <option value="${item.code }" selected="selected">
    ${item.codeValue }
    </option>
    </c:when>
    <c:when test="${empty hdy.zhengzhiMianmao and 'isNull' eq item.code }">
    <option value="${item.code }" selected="selected">
    ${item.codeValue }
    </option>
    </c:when>
    <c:otherwise>
    <option value="${item.code }" >
    ${item.codeValue }
    </option>
    </c:otherwise>
    </c:choose>
    </c:forEach>
    </select>
    </td>
    </tr>

    <tr>
    <c:choose>
    <c:when test="${dangyuan.dangZhibu.name eq '临时支部' }">
    <td align="right">
    <font color="red">分党委</font>
    </td>
    <td>
    <select name="dangweiId" id="dangwei" onchange="getZhibu();">
    <c:forEach items="${dangweis }" var="item">
    <option value="${item.id }">
    ${item.name }
    </option>
    </c:forEach>
    </select>
    </td>
    <td align="right">
    <font color="red">党支部:</font>
    </td>
    <td>
    <select name="zhibuId" id="zhibu">
    </select>
    </td>
    </c:when>
    <c:otherwise>
    <td align="right">
    所属分党委:
    </td>
    <td>
    ${dangyuan.dangZhibu.dangwei.name}
    </td>
    <td align="right">
    所属党支部:
    </td>
    <td>
    ${dangyuan.dangZhibu.name}
    </td>
    </c:otherwise>
    </c:choose>
    </tr>

    <tr>
    <td align="right">
    <font color="red">入党日期:</font>
    </td>
    <td>
    <form:input path="rudangDate" onclick="WdatePicker()" />
    </td>
    <td align="right">
    <font color="red">是否统战委员:</font>
    </td>
    <td>
    <select id="tz" name="tongzhan" >
    <option value="no" ${hdy.tongzhan=='no' ? 'selected="selected"' : ''}>否</option>
    <option value="yes" ${hdy.tongzhan=='yes' ? 'selected="selected"' : ''}>是</option>
    </select>
    </td>

    </tr>
    <tr  id="display"   >
    <td align="right">
    <font color="red">任统战委员时间:</font>
    </td>
    <td>
    <form:input path="tongzhanDate" onclick="WdatePicker()"
    cssClass="txt" size="20" />
    </td>
    <td align="right">
    <font color="red">行政职务:</font>
    </td>
    <td>
    <form:input path="xzZhiwu" cssClass="txt" size="20" />
    </td>
    </tr>
    <tr>
    <td align="right">
    <font color="red">党员状态:</font>
    </td>
    <td>
    <form:input path="dangStatus" cssClass="txt" size="20" />
    </td>
    <td align="right">
    <font color="red">转正日期:</font>
    </td>
    <td>
    <form:input path="zhuanzhengDate" onclick="WdatePicker()"
    cssClass="txt" size="20" />
    </td>
    </tr>
    <tr>
    <td align="right">
    <font color="red">离党日期:</font>
    </td>
    <td>
    <form:input path="lidangDate" onclick="WdatePicker()"
    cssClass="txt" size="20" />
    </td>
    <td align="right">
    <font color="red">离党原因:</font>
    </td>
    <td>
    <form:input path="lidangCause" cssClass="txt" size="20" />
    </td>
    </tr>
    <tr>
    <td align="right">
    <font color="red">党内职务:</font>
    </td>
    <td>
    <form:input path="dangZhiwu" cssClass="txt" size="20" />
    </td>
    <td align="right">
    <font color="red">备注:</font>
    </td>
    <td>
    <form:input path="re" cssClass="txt" size="20" />
    </td>
    </tr>
    <tr>

    <td colspan="2" align="left">
    <input  class="btn" type="button" value="返回"
    onclick="javascript:history.back(-1);" />
    <input  type="submit" value="放弃编辑,查看信息" class="btn" onClick="JavaScript:window.location.href='${viewUrl}'"/>
    <td colspan="2" align="left" >
    <input class="btn" type="submit" value="提交编辑" />
    </td>
    </tr>
    </table>
    </form:form>我看了很多遍了 我在这里没有给form的id属性赋值。结果
    在onSubEditView 中的 form.id 竟然有值。
      

  4.   

    不怎么想看代码。。看了下你的异常就知道什么原因了。
    从jsp中传过来的所有的值都是字符串类型的。。
    比如jsp要把id传到后台,你在后台用id的时候就需要转换为Integer或者Long之类的类型。。NumberFormatException,现在你的异常。
    你在id进行类型转换的时候。jsp中的id没有值,传到后台就是undefined,意思是未定义,然后你做类型转换的时候,就会报这个异常。异常都有行号的。。你点进去。。就能找到你报错的那一行代码,然后检查你的jsp页面在什么时候传值过来你的这个异常跟spring没有关系的
      

  5.   

    1。spring依赖注入。就是你在Action里面声明一个service,然后spring帮你把service实例化了。。再2。sspring的切面。。最常用的就是把不同service的业务方法包装成一个事物,如果你配置文件没有配置切面的话,也不会对你程序有影响。spring就这2点跟你的异常没关系
      

  6.   


    回: 我的那个异常 是从 cotroller 出来的 还没到jsp页面呢。 就在这中间发生的。肯定是那部分有问题,但我debug 抓不到这个 错误。
      

  7.   

    其实解决你这个异常很简单。。
    at java.lang.Long.parseLong(Long.java:403)
    找到这一行。在Long.parseLong(str)之前先判断一下这个字符串是否由数字组成的
    如果不是。不执行类型转换
    下面给你个正则表达式判断。。
    Pattern pattern = Pattern.compile("[0-9]*"); 
     pattern.matcher(str).matches(); //这个方法返回boolean值
      

  8.   

    肯定没到jsp了。。jsp请求到后台。。你后台代码某一行
    (at java.lang.Long.parseLong(Long.java:403))
    Long.paserLong(str),代码执行到这一行的时候,你的srt的值是undefined,就报NumberFormatException
      

  9.   

    我大体流程 是  前台 get 请求 ---> showEidtView --> jsp 页面 ---> onSubEditView但是 它 在showEidtView --> jsp 中间 出异常了 。 我debug 不到这个点。直接 就到了 spring的类里了 没有源文件 啥都看不到。所以我无法debug 到 at java.lang.Long.parseLong(Long.java:403) 这一行。
      

  10.   

    你根据你前台的请求,,找不到服务器端相应的哪个action方法吗?
      

  11.   

    前台的 请求 是 /dangyuan/editView.do然后 到后台 的 controller 类中 的 
    @RequestMapping(value = "/dangyuan/editView.do", method = RequestMethod.GET)
    public void showEidtView(@RequestParam("id")
    Long id, Model model) {
    DangyuanEditForm form = new DangyuanEditForm();
    model.addAttribute("dangweis", dangweiService.getAllDangweis());
    Dangyuan dangyuan = dangyuanService.getDangyuanById(id);
    Dangyuan showDy = dangyuanService.breedDy(dangyuan);
    model.addAttribute("dangyuan", showDy);
    model.addAttribute("hdy", dangyuan);
    BeanUtils.copyProperties(dangyuan, form);
    form.setId(null);
    model.addAttribute("form", form); } 
    处理  然后 正常情况下 他会返回给你的前台一个jsp 页面。editView.jsp 页面 
    这个是个表单填好后 提交给后台 由 这个 
    @RequestMapping(value = "/dangyuan/editView.do", method = RequestMethod.POST)
    public String onSubEditView(@ModelAttribute("form")
    DangyuanEditForm form, Model model) {
    dangyuanService.editDangyuanEditForm(form);
    return "redirect:/dangyuan/view.do?id=" + form.getId();
    }处理。 
    2.5的基于注解的spring mvc就是这样处理的。 
      

  12.   

    额。。没搞过注解的spring。。一般ssh。。估计是你把form的id设置为null的原因。。你把form的id给定一个试试
      

  13.   

    谢谢阁下热心帮我解答。 但是 你说的 我 做过了 我给在showEidtView 把form.setId(1L) 也没用。
    为了继续寻找答案我只能不结此贴了
      

  14.   

    下班后 直接彪 书城。找书 查。 我就不信了,现在项目反正也做完了 没事干。非把它弄明白不可。
    用这些框架,但是这些框架倒地给你包装了什么 你一点也不知道。 用起来很不爽 出了问题。让你很没辙。
    老外的东西。都是英文。个人英文水平真有限,看原版书看不懂,看翻译书,发现那些翻译的人真叫一个垃圾,买来看了发现自己照着原版 借用金山词霸 翻译 都比他翻译得好n倍
    现在坚决不买书,直接去书城白看算了 反正能看的知识毕竟有限。O(∩_∩)O~
      

  15.   

    我把form.setId(1L) 结果 后面onSubEditView debug查看到form的Id 并不是1 而是 我某个对象的Id