I tested the new Spring MVC 3.0 type conversion concept. I can’t find out how to catch conversion errors.
I am using the new mvc scheme:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="springmvc.simple"/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
And a simple class of commands:
public class Amount { @NumberFormat(style=Style.CURRENCY) @Min(0) private BigDecimal amount = BigDecimal.valueOf(10000, 2); @DateTimeFormat(iso=ISO.DATE) private Date date = new Date(); public Date getDate() { return date; } public BigDecimal getAmount() { return amount; } }
And the same simple controller:
@Controller @RequestMapping(value="/addVat.html") public class AddVatController { @InitBinder public void initBinder(WebDataBinder binder) { binder.initDirectFieldAccess(); } @RequestMapping(method = RequestMethod.GET) public String setupForm(Model model) { model.addAttribute("commandBean", new Amount()); return "addVatForm"; } @RequestMapping(method = RequestMethod.POST) public String onSubmit(@ModelAttribute("commandBean") @Valid Amount commandBean, BindingResult amountBinding, Model model) { if (amountBinding.hasErrors()) { return "addVatForm"; } BigDecimal result = commandBean.getAmount().multiply(new BigDecimal("1.175")); model.addAttribute("result", result); return "result"; } }
This works fine - I get a validation error in my result.jsp if I enter a negative value for BigDecimal. However, if I try to send a date, such as 2010-07-024, that does not match #### - ## - ##, I get an error message:
org.springframework.core.convert.ConversionFailedException: Unable to convert value 2010-07-024 from type 'java.lang.String' to type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value 2010-07-024 from type 'java.lang.String' to type 'java.util.Date'; nested exception is java.lang.IllegalArgumentException: Invalid format: "2010-07-024" is malformed at "4" org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:40) org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:135) org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:199) org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:169) org.springframework.beans.DirectFieldAccessor.setPropertyValue(DirectFieldAccessor.java:125) org.springframework.beans.AbstractPropertyAccessor.setPropertyValue(AbstractPropertyAccessor.java:50) org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76) org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:665) org.springframework.validation.DataBinder.doBind(DataBinder.java:561) org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:190) org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:110) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.doBind(AnnotationMethodHandlerAdapter.java:696) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:744) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:296) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:163) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
Which is good, but how can I lure a mistake? I was expecting the BindingResult to just contain another error?
source share