问题
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:
- recordDecisionFormModel.revisedTermExpiryDate.type Mismatch
- revisedTermExpiryDate.typeMismatch
- java.util.Date.typeMismatch
- 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