2014-02-18 51 views
0

我尝试从字符串做这个转换日期:在这种情况下,为什么无法从字符串转换为日期?

形式:

<tr> 
     <td><form:label path="dateOfBirth" cssErrorClass="error"><spring:message 
       code="account.dob"/></form:label></td> 
     <td><form:input path="dateOfBirth" type="date"/></td> 
     <td><form:errors path="dateOfBirth"/></td> 
    </tr> 

在配置类

import org.springframework.format.datetime.DateFormatter 
// ..... 

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "..." }) 
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter { 

    //.... 
    @Override 
    public void addFormatters(FormatterRegistry registry) { 
     registry.addFormatter(new DateFormatter("yyyy-MM-dd")); 
    } 
} 

日期的输入值返回正确的字符串格式

enter image description here

但它保持报告错误

未能java.lang.String类型的属性值转换为所需的 java.util.Date类型物业出生日期;嵌套异常是 org.springframework.core.convert.ConversionFailedException:无法将 从java.lang.String类型转换为类型java.util.Date,其值为 1999-01-01;嵌套异常是java.lang.IllegalArgumentException: 无法解析1999-01-01

我在这里可能会错过什么?

UPDATE

我的验证

@Override 
    public void validate(Object target, Errors errors) { 
     ValidationUtils.rejectIfEmpty(errors, "username", "required", new Object[] { "Username" }); 
     ValidationUtils.rejectIfEmpty(errors, "password", "required", new Object[] { "Password" }); 
     ValidationUtils.rejectIfEmpty(errors, "emailAddress", "required", new Object[] { "Email address" }); 
     ValidationUtils.rejectIfEmpty(errors, "address.street", "required", new Object[] { "Street" }); 
     ValidationUtils.rejectIfEmpty(errors, "address.city", "required", new Object[] { "City" }); 
     ValidationUtils.rejectIfEmpty(errors, "address.country", "required", new Object[] { "Country" }); 

     if (!errors.hasFieldErrors("emailAddress")) { 
      Account account = (Account) target; 
      String email = account.getEmailAddress(); 
      if (!email.matches(EMAIL_PATTERN)) { 
       errors.rejectValue("emailAddress", "invalid"); 
      } 
     } 
    } 

我处理

@RequestMapping(method = { RequestMethod.POST, RequestMethod.PUT }) 
public String handleRegistration(@Valid @ModelAttribute Account account, 
           BindingResult result) 
{ 
    this.logger.info("Registering account: {}", account); 

    if (result.hasErrors()) { 
     return "customer/register"; 
    } 
    this.accountService.save(account); 
    return "redirect:/customer/account/" + account.getId(); 
} 

这里充满堆栈跟踪

14:06:44.556 [http-bio-8080-exec-6] TRACE o.s.web.servlet.DispatcherServlet - Bound request context to thread: [email protected] 
14:06:44.557 [http-bio-8080-exec-6] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcher' processing POST request for [/chapter6-bookstore/customer/register] 
14:06:44.557 [http-bio-8080-exec-6] TRACE o.s.web.servlet.DispatcherServlet - Testing handler map [org.springframework[email protected]27a9283] in DispatcherServlet with name 'dispatcher' 
14:06:44.557 [http-bio-8080-exec-6] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /customer/register 
14:06:44.557 [http-bio-8080-exec-6] TRACE o.s.w.s.m.m.a.RequestMappingHandlerMapping - Found 1 matching mapping(s) for [/customer/register] : [{[/customer/register],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}] 
14:06:44.557 [http-bio-8080-exec-6] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [public java.lang.String com.apress.prospringmvc.bookstore.web.controller.RegistrationController.handleRegistration(com.apress.prospringmvc.bookstore.domain.Account,org.springframework.validation.BindingResult)] 
14:06:44.557 [http-bio-8080-exec-6] TRACE o.s.web.servlet.DispatcherServlet - Testing handler adapter [org.springframework[email protected]46b61f25] 
14:06:44.557 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springfra[email protected]7f22c404] supports [class com.apress.prospringmvc.bookstore.domain.Account] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframew[email protected]71e75afc] supports [class com.apress.prospringmvc.bookstore.domain.Account] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.s[email protected]57ffc75d] supports [class com.apress.prospringmvc.bookstore.domain.Account] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.ser[email protected]2aea9f96] supports [class com.apress.prospringmvc.bookstore.domain.Account] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springfra[email protected]7f22c404] supports [interface org.springframework.validation.BindingResult] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframew[email protected]71e75afc] supports [interface org.springframework.validation.BindingResult] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.s[email protected]57ffc75d] supports [interface org.springframework.validation.BindingResult] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.ser[email protected]2aea9f96] supports [interface org.springframework.validation.BindingResult] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.s[email protected]38670b9] supports [interface org.springframework.validation.BindingResult] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.[email protected]510ffbf9] supports [interface org.springframework.validation.BindingResult] 
14:06:44.558 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springfram[email protected]61bc5ad9] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframewo[email protected]1cdf3eeb] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.servlet[email protected]1f36d53b] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframew[email protected]303156f7] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.ser[email protected]1907d2c7] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.serv[email protected]3b130da9] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframew[email protected]7e1194af] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.springframework.web.servlet[email protected]14a6f81a] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [[email protected]fa50c24] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [[email protected]83e3c] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodArgumentResolverComposite - Testing if argument resolver [org.spr[email protected]1e3e6be0] supports [interface org.springframework.validation.BindingResult] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodReturnValueHandlerComposite - Testing if return value handler [org.springframework.web.ser[email protected]2f504468] supports [class java.lang.String] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodReturnValueHandlerComposite - Testing if return value handler [[email protected]e63aaf] supports [class java.lang.String] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodReturnValueHandlerComposite - Testing if return value handler [org.springframework[email protected]37bf1fd4] supports [class java.lang.String] 
14:06:44.559 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodReturnValueHandlerComposite - Testing if return value handler [org.springframew[email protected]4351dda1] supports [class java.lang.String] 
14:06:44.560 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodReturnValueHandlerComposite - Testing if return value handler [org.spri[email protected]4673cae7] supports [class java.lang.String] 
14:06:44.560 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodReturnValueHandlerComposite - Testing if return value handler [org.springframework.web.s[email protected]3dfb2615] supports [class java.lang.String] 
14:06:44.563 [http-bio-8080-exec-6] TRACE o.s.w.m.s.HandlerMethodReturnValueHandlerComposite - Testing if return value handler [org.springframework.web[email protected]7edf47aa] supports [class java.lang.String] 
14:06:44.564 [http-bio-8080-exec-6] TRACE o.s.w.m.s.InvocableHandlerMethod - Invoking [countries] method with arguments [en_US] 
14:06:44.565 [http-bio-8080-exec-6] TRACE o.s.w.m.s.InvocableHandlerMethod - Method [countries] returned [{=, AE=United Arab Emirates, AL=Albania, AR=Argentina, AT=Austria, AU=Australia, BA=Bosnia and Herzegovina, BE=Belgium, BG=Bulgaria, BH=Bahrain, BO=Bolivia, BR=Brazil, BY=Belarus, CA=Canada, CH=Switzerland, CL=Chile, CN=China, CO=Colombia, CR=Costa Rica, CS=Serbia and Montenegro, CU=Cuba, CY=Cyprus, CZ=Czech Republic, DE=Germany, DK=Denmark, DO=Dominican Republic, DZ=Algeria, EC=Ecuador, EE=Estonia, EG=Egypt, ES=Spain, FI=Finland, FR=France, GB=United Kingdom, GR=Greece, GT=Guatemala, HK=Hong Kong, HN=Honduras, HR=Croatia, HU=Hungary, ID=Indonesia, IE=Ireland, IL=Israel, IN=India, IQ=Iraq, IS=Iceland, IT=Italy, JO=Jordan, JP=Japan, KR=South Korea, KW=Kuwait, LB=Lebanon, LT=Lithuania, LU=Luxembourg, LV=Latvia, LY=Libya, MA=Morocco, ME=Montenegro, MK=Macedonia, MT=Malta, MX=Mexico, MY=Malaysia, NI=Nicaragua, NL=Netherlands, NO=Norway, NZ=New Zealand, OM=Oman, PA=Panama, PE=Peru, PH=Philippines, PL=Poland, PR=Puerto Rico, PT=Portugal, PY=Paraguay, QA=Qatar, RO=Romania, RS=Serbia, RU=Russia, SA=Saudi Arabia, SD=Sudan, SE=Sweden, SG=Singapore, SI=Slovenia, SK=Slovakia, SV=El Salvador, SY=Syria, TH=Thailand, TN=Tunisia, TR=Turkey, TW=Taiwan, UA=Ukraine, US=United States, UY=Uruguay, VE=Venezuela, VN=Vietnam, YE=Yemen, ZA=South Africa}] 
14:06:44.565 [http-bio-8080-exec-6] TRACE o.s.w.m.s.InvocableHandlerMethod - Invoking [initBinder] method with arguments [org.springframework.web[email protected]6256041a] 
14:06:44.566 [http-bio-8080-exec-6] TRACE o.s.w.m.s.InvocableHandlerMethod - Method [initBinder] returned [null] 
14:06:44.579 [http-bio-8080-exec-6] TRACE o.s.w.s.m.m.a.ServletInvocableHandlerMethod - Invoking [handleRegistration] method with arguments [[email protected], org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'account' on field 'dateOfBirth': rejected value [1999-01-01]; codes [typeMismatch.account.dateOfBirth,typeMismatch.dateOfBirth,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [account.dateOfBirth,dateOfBirth]; arguments []; default message [dateOfBirth]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'dateOfBirth'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value '1999-01-01'; nested exception is java.lang.IllegalArgumentException: Unable to parse '1999-01-01']] 
14:06:44.579 [http-bio-8080-exec-6] TRACE o.s.w.s.m.m.a.ServletInvocableHandlerMethod - Method [handleRegistration] returned [customer/register] 
14:06:44.583 [http-bio-8080-exec-6] DEBUG o.s.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.tiles2.TilesView: name 'customer/register'; URL [customer/register]] in DispatcherServlet with name 'dispatcher' 
14:06:44.584 [http-bio-8080-exec-6] TRACE o.s.w.servlet.view.tiles2.TilesView - Rendering view with name 'customer/register' with model {countries={=, AE=United Arab Emirates, AL=Albania, AR=Argentina, AT=Austria, AU=Australia, BA=Bosnia and Herzegovina, BE=Belgium, BG=Bulgaria, BH=Bahrain, BO=Bolivia, BR=Brazil, BY=Belarus, CA=Canada, CH=Switzerland, CL=Chile, CN=China, CO=Colombia, CR=Costa Rica, CS=Serbia and Montenegro, CU=Cuba, CY=Cyprus, CZ=Czech Republic, DE=Germany, DK=Denmark, DO=Dominican Republic, DZ=Algeria, EC=Ecuador, EE=Estonia, EG=Egypt, ES=Spain, FI=Finland, FR=France, GB=United Kingdom, GR=Greece, GT=Guatemala, HK=Hong Kong, HN=Honduras, HR=Croatia, HU=Hungary, ID=Indonesia, IE=Ireland, IL=Israel, IN=India, IQ=Iraq, IS=Iceland, IT=Italy, JO=Jordan, JP=Japan, KR=South Korea, KW=Kuwait, LB=Lebanon, LT=Lithuania, LU=Luxembourg, LV=Latvia, LY=Libya, MA=Morocco, ME=Montenegro, MK=Macedonia, MT=Malta, MX=Mexico, MY=Malaysia, NI=Nicaragua, NL=Netherlands, NO=Norway, NZ=New Zealand, OM=Oman, PA=Panama, PE=Peru, PH=Philippines, PL=Poland, PR=Puerto Rico, PT=Portugal, PY=Paraguay, QA=Qatar, RO=Romania, RS=Serbia, RU=Russia, SA=Saudi Arabia, SD=Sudan, SE=Sweden, SG=Singapore, SI=Slovenia, SK=Slovakia, SV=El Salvador, SY=Syria, TH=Thailand, TN=Tunisia, TR=Turkey, TW=Taiwan, UA=Ukraine, US=United States, UY=Uruguay, VE=Venezuela, VN=Vietnam, YE=Yemen, ZA=South Africa}, [email protected]c, org.springframework.validation.BindingResult.account=org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'account' on field 'dateOfBirth': rejected value [1999-01-01]; codes [typeMismatch.account.dateOfBirth,typeMismatch.dateOfBirth,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [account.dateOfBirth,dateOfBirth]; arguments []; default message [dateOfBirth]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'dateOfBirth'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value '1999-01-01'; nested exception is java.lang.IllegalArgumentException: Unable to parse '1999-01-01'], randomBooks=[[email protected][ 
    title=Refactoring: Improving the Design of Existing Code 
    author=Martin Fowler 
    isbn=9780201485677 
], [email protected][ 
    title=Clean Code: A Handbook of Agile Software Craftsmanship 
    author=Robert C. Martin 
    isbn=9780132350884 
]]} and static attributes {} 
+0

请发布完整的堆栈跟踪。 –

+0

请同时发布期望命令对象的处理程序方法。 –

+0

@SotiriosDelimanolis我更新了这个问题。 – jAckOdE

回答

3

广告d这到您的控制器:

@InitBinder 
public void initBinder(final WebDataBinder binder){ 
    final SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); 
} 
相关问题