2013-03-19 2 views
1

날짜 필드가있는 양식이 있습니다. DTO에서 Calendar 특성을 사용하여 바인딩 할 수있는 방법을 알고 싶습니다. String으로 시도했지만 java.sql.Date 로의 변환이 매우 복잡했습니다.Spring MVC를 사용하여 DTO에서 캘린더를 바인딩하는 방법

HTTP ERROR 500 

Problem accessing /cemiterio/feriados/cadastrar/. Reason: 

    org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'holidayDTO' on field 'date': rejected value [23/12/1988]; codes [typeMismatch.holidayDTO.date,typeMismatch.date,typeMismatch.java.util.Calendar,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [holidayDTO.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Calendar' for property 'date'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Calendar] for property 'date': no matching editors or conversion strategy found] 
Caused by: 

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'holidayDTO' on field 'date': rejected value [23/12/1988]; codes [typeMismatch.holidayDTO.date,typeMismatch.date,typeMismatch.java.util.Calendar,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [holidayDTO.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Calendar' for property 'date'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Calendar] for property 'date': no matching editors or conversion strategy found] 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:810) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
+0

HTML 5는 날짜 입력 제어를 도입하지만 이전 versions.So (기본적으로) 문자열로 전달하고 Action 클래스의 날짜로 변환해야합니다. –

+0

를 사용하면 같은 오류를 반환합니다. – claudioivp

답변

3
:

는 HTML

<input type="text" id="date" name="date" /> 

스프링 MVC는

@RequestMapping(value = "/newholiday", method=RequestMethod.POST) 
public String cadastrar(ModelMap model, HolidayDTO dto) { 
    System.out.println(dto.getDate()); 
    return "/newholiday"; 
} 

DTO는

public class HolidayDTO extends DTO<Holiday> { 
    private Calendar date; 
} 

직접하는 경우는 예외를 반환

Calendar 개체를 사용하는 대신 Joda Time을 사용하는 것이 좋습니다. 왜냐하면 사용자가 날짜 시간 조작을 할 수있는 모든 유연성을 갖추고 가장 중요한 것은 변경할 수 없기 때문입니다. java.sql.Date에 Joda DateTime 변환하면이만큼 간단하다 : - :

봄 양식

public class MyForm { 

    @DateTimeFormat(pattern = "MM/dd/yyyy") 
    private DateTime dateTime; 

    public DateTime getDateTime() { 
     return dateTime; 
    } 

    public void setDateTime(DateTime dateTime) { 
     this.dateTime = dateTime; 
    } 
} 

컨트롤러

@Controller 
@RequestMapping(value = "/") 
public class HomeController { 

    @RequestMapping(method = RequestMethod.POST) 
    public String post(@ModelAttribute MyForm myForm) { 
     System.out.println("@@@@@@: " + myForm.getDateTime()); 
     return "home"; 
    } 
} 
-

여기
DateTime dateTime = ...; 
java.sql.Date sqlDate = new java.sql.Date(dateTime.getMillis()); 

은 예입니다

JSP

<spring:form modelAttribute="myForm"> 
    <spring:input path="dateTime"/> 
    <spring:button>Submit</spring:button> 
</spring:form> 
+0

쿨하지만 스프링 -mvc DTO 바인드에 대해 ... – claudioivp

+1

나는 전체 작동 예제로 게시물을 업데이트했습니다. – limc

+0

쿨, 정말 멋지다. 문제가 더 많이 있습니다. 잘못된 날짜를 입력하면 예외를 추가하는 방법이 없습니다 : "올바른 날짜를 입력하십시오." 'rejected value [12/42/2012] 'java.lang.String'유형의 속성 값을 필수 유형 'org.joda.time.DateTime'으로 변환하는 데 실패했습니다 – claudioivp

관련 문제