更改表单中的spring jsp日期输入绑定以使用freemarker
Posted
技术标签:
【中文标题】更改表单中的spring jsp日期输入绑定以使用freemarker【英文标题】:changing spring jsp date input bind in a form to use freemarker 【发布时间】:2011-01-24 03:19:59 【问题描述】:我正在尝试将 spring jsp 示例更改为使用 freemarker。
我更改了表单中的所有字段,如下所示:
一切都很顺利。表单绑定到对象并且所有内容都已验证,但我无法让这部分工作。
在jsp中是
renewalDate 是一个 java.util.Date 对象。页面打开,错误从日期输入字段的位置开始。
方法公开 org.springframework.web.servlet.support.BindStatus org.springframework.web.servlet.support.RequestContext.getBindStatus(java.lang.String) 抛出 java.lang.IllegalStateException 调用时抛出异常 org.springframework.web.servlet.support.RequestContext@1b5c22f 带有类型的参数 [java.lang.String,] 有问题的 指令: ---------- ==> 任务: 状态=springMacroRequestContext.getBindStatus(路径) [在第 120 行,spring.ftl 中的第 9 列] 在用户指令绑定 [第 159 行, spring.ftl 中的第 5 列] 在 用户指令 spring.formInput [on createForm.ftl 中的第 36 行第 41 列] ---------- 程序员的Java回溯: ---------- freemarker.template.TemplateModelException: 方法公开 org.springframework.web.servlet.support.BindStatus org.springframework.web.servlet.support.RequestContext.getBindStatus(java.lang.String) 抛出 java.lang.IllegalStateException 调用时抛出异常 org.springframework.web.servlet.support.RequestContext@1b5c22f 带有类型的参数 [java.lang.String,] 在 freemarker.ext.beans.OverloadedMethodModel.exec(OverloadedMethodModel.java:134) 在 freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93) 在 freemarker.core.Expression.getAsTemplateModel(Expression.java:89) 在 freemarker.core.Assignment.accept(Assignment.java:90) 在 freemarker.core.Environment.visit(Environment.java:210) 在 freemarker.core.IfBlock.accept(IfBlock.java:82) 在 freemarker.core.Environment.visit(Environment.java:210) 在 freemarker.core.MixedContent.accept(MixedContent.java:92) 在 freemarker.core.Environment.visit(Environment.java:210) 在 freemarker.core.Macro$Context.runMacro(Macro.java:172) 在 freemarker.core.Environment.visit(Environment.java:603) 在 freemarker.core.UnifiedCall.accept(UnifiedCall.java:106) 在 freemarker.core.Environment.visit(Environment.java:210) 在 freemarker.core.MixedContent.accept(MixedContent.java:92) 在 freemarker.core.Environment.visit(Environment.java:210) 在 freemarker.core.Macro$Context.runMacro(Macro.java:172) 在 freemarker.core.Environment.visit(Environment.java:603) 在 freemarker.core.UnifiedCall.accept(UnifiedCall.java:106) 在 freemarker.core.Environment.visit(Environment.java:210) 在 freemarker.core.MixedContent.accept(MixedContent.java:92) 在 freemarker.core.Environment.visit(Environment.java:210) 在 freemarker.core.Environment.process(Environment.java:190) 在 freemarker.template.Template.process(Template.java:237) 在 org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366) 在 org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:283) 在 org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233) 在 org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167) 在 org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) 在 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:530) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:427) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:494) 在 org.eclipse.jetty.server.session.SessionHandler.handle(SessionHandler.java:182) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:933) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:362) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:867) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:245) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113) 在 org.eclipse.jetty.server.Server.handle(Server.java:330) 在 org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:559) 在 org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:992) 在 org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:541) 在 org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:203) 在 org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:406) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:462) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436) 在 java.lang.Thread.run(未知 来源)原因: org.springframework.core.convert.ConversionFailedException: 无法转换值 Sat Mar 05 15:49:22 EET 2011 从类型 'java.util.Date' 键入 'java.lang.String';嵌套异常 是 java.lang.IllegalStateException: JodaTime 库不可用 - @DateTimeFormat 不支持 org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:40) 在 org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:138) 在 org.springframework.validation.AbstractPropertyBindingResult.formatFieldValue(AbstractPropertyBindingResult.java:122) 在 org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:227) 在 org.springframework.web.servlet.support.BindStatus.(BindStatus.java:120) 在 org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:726) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(未知 来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知 来源)在 java.lang.reflect.Method.invoke(未知 来源)在 freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:840) 在 freemarker.ext.beans.OverloadedMethodModel.exec(OverloadedMethodModel.java:104) ... 54 更多原因: java.lang.IllegalStateException: JodaTime 库不可用 - @DateTimeFormat 不支持 org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory.getPrinter(FormattingConversionServiceFactoryBean.java:131) 在 org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory.getPrinter(FormattingConversionServiceFactoryBean.java:1) 在 org.springframework.format.support.FormattingConversionService$1.convert(FormattingConversionService.java:78) 在 org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:37) ... 65 更多
【问题讨论】:
【参考方案1】:看看原因:
原因:java.lang.IllegalStateException:JodaTime 库不可用 -
不支持 @DateTimeFormat
您的renewalDate
字段使用@DateTimeFormat
进行注释,除非您将JodaTime 添加到类路径,否则该字段将不起作用。
【讨论】:
以上是关于更改表单中的spring jsp日期输入绑定以使用freemarker的主要内容,如果未能解决你的问题,请参考以下文章
在Spring boot中,如何将表单动作中的jsp表单输入的值作为参数传递