• Spring MVC与表单日期提交的问题


    Spring MVC与表单日期提交的问题

    spring mvc 本身并不提供日期类型的解析器,需要手工绑定, 否则会出现非法参数异常.

     org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.Date]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException

    解决方法很简单,只需要在controller 里面注册一个类型解析器:

        @InitBinder
        public void InitBinder(HttpServletRequest request,
                ServletRequestDataBinder binder) {
            // 不要删除下行注释!!! 将来"yyyy-MM-dd"将配置到properties文件中
            // SimpleDateFormat dateFormat = new
            // SimpleDateFormat(getText("date.format", request.getLocale()));
            SimpleDateFormat dateFormat = new SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:ss");
            dateFormat.setLenient(false);
            binder.registerCustomEditor(Date.class, null, new CustomDateEditor(
                    dateFormat, true));
        }    

    这样就ok了,

    demo 如下:

    controller 

    @RequestMapping("bakComment")
    @Controller
    public class BakCommentController {
        Logger logger = Logger.getLogger(getClass());
        @Resource
        private CommentService commentService;
    
        //@InitBinder
        public void InitBinder(HttpServletRequest request,
                ServletRequestDataBinder binder) {
            // 不要删除下行注释!!! 将来"yyyy-MM-dd"将配置到properties文件中
            // SimpleDateFormat dateFormat = new
            // SimpleDateFormat(getText("date.format", request.getLocale()));
            SimpleDateFormat dateFormat = new SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:ss");
            dateFormat.setLenient(false);
            binder.registerCustomEditor(Date.class, null, new CustomDateEditor(
                    dateFormat, true));
        }
    
        @RequestMapping("verifyComment")
        public void verifyComment(@ModelAttribute("comment") TSdComment comment,
                HttpServletRequest request, HttpServletResponse response)
                throws IOException {
            logger.info(comment);
         
            String str = "success";
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(str);
        }
    }

    html:

    <form:form modelAttribute="comment" class="form" method="post">
            <fieldset>
                <legend> 账单信息 </legend>
                <table class="table" style=" 100%;">
                    <tr>
                        <th>ID</th>
                        <td><input name="commentId" value="<%=uid%>"
                            readonly="readonly" /></td>
                        <th>用户ID</th>
                        <td><input name="restaurantId" class="easyui-validatebox"
                            data-options="required:true" readonly="readonly" /></td>
                    </tr>
                    <tr>
                        <th>商家名称</th>
                        <td><input name="restaurantName" readonly="readonly" /></td>
                        <th>创建时间</th>
                        <td><input name="createTime" readonly="readonly" /></td>
                    </tr>
                    <tr>
                        <th>消费金额</th>
                        <td><input name="commentSpending" /></td>
                        <th>抵金卷面额</th>
                        <td><input name="voucherDenomination" /></td>
                    </tr>
                    <tr>
                        <th>审核状态</th>
                        <td><select>
                                <option value="2">待检测</option>
                                <option value="3">已检查(通过)</option>
                                <option value="4">已检查(不通过)</option>
                        </select></td>
                        <th>原因</th>
                        <td><input name="commentRemark" /></td>
                    </tr>
                    <tr>
                        <th>账单</th>
                        <td colspan="3"><div style=" 600px" id="commentPic"></div>
                        </td>
                    </tr>
                </table>
            </fieldset>
        </form:form>

    控制台如下:

     2014-05-23 13:32:09,514 [http-bio-8080-exec-1] INFO  [com.sd.microMsg.controller.BakCommentController] - TSdComment [commentId=11, userId=null, restaurantId=1, voucherId=null, restaurantName=笑嘻嘻, commentMlb=null, commentContext=null, commentPersonNo=null, voucherDenomination=30.0, commentSpending=300.0, commentPictureId=null, commentPraiseCount=null, commentNegativeCount=null, commentSelectCount=null, commentSubCommentCount=null, commentReContext=null, commentRemark=mohu, commentCheckedStatus=null, commentBusinessStatus=null, createType=null, createTime=Sat May 17 19:05:52 GMT+08:00 2014, lastActiveTime=null, checkedTime=null, commentTempConsumptionTopNum=null, commentTempPerCapitaConsumptionTopNum=null, commentType=null, commentMlzs=null, commentPlusMlzs=null, commentMark=null, commentSubMark=null, version=null, dtype=null]

    不绑定解析器异常堆栈如下:

     1  org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.Date]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException
     2     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162)
     3     at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:198)
     4     at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470)
     5     at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516)
     6     at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1119)
     7     at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:924)
     8     at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)
     9     at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:692)
    10     at org.springframework.validation.DataBinder.doBind(DataBinder.java:588)
    11     at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:191)
    12     at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:112)
    13     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.doBind(AnnotationMethodHandlerAdapter.java:785)
    14     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:813)
    15     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:367)
    16     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    17     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    18     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    19     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    20     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    21     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    22     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    23     at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    24     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    25     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    26     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    27     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    28     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    29     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    30     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    31     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    32     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    33     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    34     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    35     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    36     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    37     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    38     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    39     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    40     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    41     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    42     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    43     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    44     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    45     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    46     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    47     at java.lang.Thread.run(Thread.java:745)
    48 Caused by: java.lang.IllegalArgumentException
    49     at java.util.Date.parse(Date.java:615)
    50     at java.util.Date.<init>(Date.java:272)
    51     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    52     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    53     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    54     at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    55     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
    56     ... 45 more
    57 2014-05-23 13:25:52,323 [http-bio-8080-exec-1] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Returning cached instance of singleton bean 'sqlSessionFactory'
    58  五月 23, 2014 1:25:52 下午 org.apache.catalina.core.StandardWrapperValve invoke
    59 严重: Servlet.service() for servlet [springMvc] in context with path [/prot] threw exception [Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
    60 Field error in object 'comment' on field 'createTime': rejected value [2014-05-17 19:05:52]; codes [typeMismatch.comment.createTime,typeMismatch.createTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [comment.createTime,createTime]; arguments []; default message [createTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createTime'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property 'createTime': no matching editors or conversion strategy found]] with root cause
    61 org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
    62 Field error in object 'comment' on field 'createTime': rejected value [2014-05-17 19:05:52]; codes [typeMismatch.comment.createTime,typeMismatch.createTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [comment.createTime,createTime]; arguments []; default message [createTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createTime'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property 'createTime': no matching editors or conversion strategy found]
    63     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:818)
    64     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:367)
    65     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    66     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    67     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    68     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    69     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    70     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    71     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    72     at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    73     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    74     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    75     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    76     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    77     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    78     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    79     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    80     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    81     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    82     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    83     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    84     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    85     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    86     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    87     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    88     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    89     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    90     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    91     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    92     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    93     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    94     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    95     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    96     at java.lang.Thread.run(Thread.java:745)
  • 相关阅读:
    使用watch定时执行命令并显示结果
    LVS配置
    myeclipse通过查询源码查询方法
    导入struts2框架项目无法运行tomcat
    解决eclipse/myeclipse导入项目时出现红色叹号的方法
    my/eclipse中的debug调试
    导入项目后servlet报错
    转到Servlet出现500型错误
    关于快捷键导包失败
    关于jsp找不到servlet
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3747524.html
Copyright © 2020-2023  润新知