Spring webflow and type conversion for date formatting

蹲街弑〆低调 提交于 2019-12-23 05:17:24

问题


Environment:

Spring 3.1.3.RELEASE

Spring webflow 2.3.0.RELEASE

I have posted this question recently on spring source forum. See: Spring webflow formatting issue

I followed the steps outlined in the reference documentation and the top answer in stackoverflow too:

Answer

I expect when my form submits and binding occurs, that a parse exception is thrown when entering in an invalid date value. But i do not see this happening.

Also if and when the exception is thrown, how do i handle it to display error message on the front end?

I wanted to start using type conversions in my application. I followed the steps below for configuring type conversion formatting for spring MVC and SWF.

I followed the steps and added into the servlet context

<!-- Enables controllers mapped with @RequestMapping annotations, formatting annotations @NumberFormat
    @DateTimeFormat, and JSR 303 style validation --> 
   <mvc:annotation-driven conversion-service="applicationConversionService1" />

<webflow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" view-factory-creator="mvcViewFactoryCreator" development="true"/>

<bean id="defaultConversionService" class="org.springframework.binding.convert.service.DefaultConversionService"> 
        <constructor-arg ref="applicationConversionService1"/> 
   </bean>

I created a new class to register my own formatter for use in both Spring MVC and in Spring Web Flow.

@Component(value = "applicationConversionService1")
public class ApplicationConversionServiceFactoryBean extends
        FormattingConversionServiceFactoryBean {

    @Override
    protected void installFormatters(FormatterRegistry registry) {
      // Register the default date formatter provided by Spring
      registry.addFormatter(new DateFormatter("dd/MM/yyyy"));
    } 

}

Now when i deploy to the server, the context is initialised correctly and classpath scanning registers the bean.

In my form model that binds, i have annotated a date field with the new dateformat annotation.

@DateTimeFormat(pattern="dd/MM/yyyy")
    private Date revisedTermExpiryDate = new Date();

UPDATE: I was debugging and as i have joda-time on my classpath i believe spring is registering joda DateTimeFormatter instead and the parsing is not failing.

If i remove the annotation actually it calls DateFormatter which throws parse exception as expected but the exception is swallowed in the framework.

My objective is to register the plain DateFormatter with a global default date, parse strictly (lenient=false) and handle any parse exceptions gracefully. This to me is a great feature to have rather than handling parsing dates in validator for every web flow.

Thanks, Shane.


回答1:


UPDATE 2:

I found why the exception was swallowed in our application, We were clearing the messages from the message context when validating.

So If the date formatter throws an exception due to invalid value inputted by the user, spring handles this gracefully and creates four error message keys in the message context related to that field. For example if field revisedTermExpiryDate fails, four new keys will be created:

  1. recordDecisionFormModel.revisedTermExpiryDate.type Mismatch
  2. revisedTermExpiryDate.typeMismatch
  3. java.util.Date.typeMismatch
  4. typeMismatch

All you need to do is specify in your messages.properties one of these keys with your validation message.

Example:

revisedTermExpiryDate.typeMismatch=Revised Term Expiry Date: DATE IS INVALID

Solved!!



来源:https://stackoverflow.com/questions/14156651/spring-webflow-and-type-conversion-for-date-formatting

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!