2013-08-05 1 views
1

Я борюсь с проверкой моей модели в приложении на основе Spring Roo. Опишем более подробно, что я до сих пор:@AssertTrue валидация для поля даты в приложении Spring Roo не работает

public class Record { 
    // ... some other fields 

    @NotNull 
    @Future 
    @Temporal(TemporalType.TIMESTAMP) 
    @DateTimeFormat(style="M-") 
    Date generatedDate; 

    @AssertTrue(message="blahblahblah") 
    public Boolean isGeneratedDate() { 
     // validation code, let's presume it return false all the time 
     return false; 
    } 
} 

После того, как я побегу это так, то я получу следующее исключение: (? Или Роо)

SEVERE: Servlet.service() for servlet Portal threw exception 
java.lang.IllegalArgumentException: The source to convert from must be an instance of @javax.validation.constraints.NotNull @javax.validation.constrai 
nts.Future @javax.persistence.Temporal @org.springframework.format.annotation.DateTimeFormat java.util.Date; instead it was a java.lang.Boolean 
     at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:166) 
     at org.springframework.validation.AbstractPropertyBindingResult.formatFieldValue(AbstractPropertyBindingResult.java:125) 
     at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:222) 
     at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120) 
     at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178) 
     at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198) 
     at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:164) 
     at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:127) 
     at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421) 
     at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142) 
     at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102) 
     at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) 
     at org.apache.jsp.tag.web.form.fields.datetime_tagx._jspx_meth_form_005finput_005f0(datetime_tagx.java:711) 
     at org.apache.jsp.tag.web.form.fields.datetime_tagx.doTag(datetime_tagx.java:318) 
     at org.apache.jsp.WEB_002dINF.views.portationrecords.create_jspx._jspx_meth_field_005fdatetime_005f1(create_jspx.java:302) 
     at org.apache.jsp.WEB_002dINF.views.portationrecords.create_jspx.access$7(create_jspx.java:281) 
     at org.apache.jsp.WEB_002dINF.views.portationrecords.create_jspx$Helper.invoke0(create_jspx.java:378) 
     at org.apache.jsp.WEB_002dINF.views.portationrecords.create_jspx$Helper.invoke(create_jspx.java:397) 
     at org.apache.jsp.tag.web.form.create_tagx$Helper.invoke0(create_tagx.java:688) 
     at org.apache.jsp.tag.web.form.create_tagx$Helper.invoke(create_tagx.java:729) 
     at org.apache.jsp.tag.web.util.panel_tagx._jspx_meth_c_005fif_005f0(panel_tagx.java:184) 
     at org.apache.jsp.tag.web.util.panel_tagx.doTag(panel_tagx.java:130) 
     at org.apache.jsp.tag.web.form.create_tagx.doTag(create_tagx.java:233) 
     at org.apache.jsp.WEB_002dINF.views.portationrecords.create_jspx._jspx_meth_form_005fcreate_005f0(create_jspx.java:102) 
     at org.apache.jsp.WEB_002dINF.views.portationrecords.create_jspx._jspService(create_jspx.java:66) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
     at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) 
     at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 
     at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968) 
     at org.apache.jasper.runtime.PageContextImpl.doInclude(PageContextImpl.java:650) 
     at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:644) 
     at org.apache.tiles.jsp.context.JspTilesRequestContext.include(JspTilesRequestContext.java:103) 
     at org.apache.tiles.jsp.context.JspTilesRequestContext.dispatch(JspTilesRequestContext.java:96) 
     at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44) 
     at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106) 
     at org.apache.tiles.renderer.impl.ChainedDelegateAttributeRenderer.write(ChainedDelegateAttributeRenderer.java:76) 
     at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:336) 
     at org.apache.tiles.template.InsertAttributeModel.renderAttribute(InsertAttributeModel.java:210) 
     at org.apache.tiles.template.InsertAttributeModel.end(InsertAttributeModel.java:126) 
     at org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:311) 
     at org.apache.jsp.WEB_002dINF.layouts.default_jspx._jspx_meth_tiles_005finsertAttribute_005f2(default_jspx.java:224) 
     at org.apache.jsp.WEB_002dINF.layouts.default_jspx._jspService(default_jspx.java:87) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
     at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) 
     at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) 
     at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) 
     at org.apache.tiles.servlet.context.ServletTilesRequestContext.forward(ServletTilesRequestContext.java:241) 
     at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:222) 
     at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44) 
     at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:690) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:644) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:627) 
     at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321) 
     at org.springframework.web.servlet.view.tiles2.TilesView.renderMergedOutputModel(TilesView.java:124) 
     at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262) 
     at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147) 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311) 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:5 
4) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java 
:182) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 

Это выглядит как весна пытается получить результат проверки и показать его в jspx. На представлении я использую create.jspx порожденную Роо, где этот тег определяется следующим образом:

<field:datetime dateTimePattern="${record_generateddate_date_format}" field="generatedDate" future="true" id="c_com_namespace_Record_generatedDate" required="true" z="ByZXwLcdD87pSCjgpCV7ac0ASq4="/> 

Я также наблюдается, что, как только я переименовать метод проверяющий к чему-то вроде isValid(), проверка работает правильно, хотя на этот раз не существующее поле valid помечено как вызывающее проблемы (очевидно, на основе имени метода). В результате я не могу отобразить сообщение для правильного поля в окне . (да, я мог бы переключить его на RecordController, но он чувствует себя неудачно). Любые подсказки, как преодолеть это?

ответ

1

Это потому, что вы нарушаете какой-либо элемент заголовка java, или, по крайней мере, путаете валидатор.

У вас есть поле generatedDate с добытчиками и сеттеров (генерируемый Роо):

Date generatedDate; 
Date getGeneratedDate()... 
void setGeneratedDate(Date d)... 

И тогда у вас есть этот метод isGeneratedDate(). К сожалению, этот метод соответствует соглашению об именах java bean для логического значения с именем generatedDate!

Я бы рекомендовал переименовать isGeneratedDate() так что-то вроде: isGeneratedDateValid()

+0

Да, я понимаю. Как вы сказали, решение состоит в том, чтобы переименовать аннотированный метод. Однако у меня есть еще одно препятствие, которое я не смог решить: когда я это сделаю, тогда в BindingResult в моем «RecordController» будет ошибка с ошибкой, и ошибка не привязана к полю 'generatedDate', а к' generatedDateValid '- и сообщение не будет отображаться в пользовательском интерфейсе пользователя. Как преодолеть это? – gurbi

+0

Используйте explicite '' в jsp. – Ralph

+0

Да, это сделал трюк. Спасибо за помощь. – gurbi