2014-05-16 40 views
9

Tôi nhận được lỗi này khi tôi cố gắng nhập ngày trong biểu mẫu. enter image description hereKhông thể chuyển đổi giá trị thuộc tính của loại java.lang.String thành loại yêu cầu java.util.Date

TaskController

@RequestMapping(value = "/docreatetask", method = RequestMethod.POST) 
public String doCreateTask(Model model, @Valid Task task, 
     BindingResult result, Principal principal, 
     @RequestParam(value = "delete", required = false) String delete) { 
    System.out.println(">TaskController doCreateTask " + task); 

    if (result.hasErrors()) { 
     System.out.println("/docreatetask in here"); 
     model.addAttribute("task", task); 
     System.out.println("+++++"+task.getDeadline());// deadline is null 
     return "createtask"; 
    } 
     ... 

Create.jsp

... 
<form:form method="POST" 
action="${pageContext.request.contextPath}/docreatetask" 
commandName="task"> 
<table class="formtable"> 
    <tr> 
     <td class="label">Task</td> 
     <td><form:input cssClass="control" path="taskname" 
      name="taskname" type="text" /><br /> 
       <form:errors path="taskname" cssClass="error" /></td> 
     </tr> 
    <tr> 
     <td class="label">Description</td> 
     <td><form:textarea cssClass="control" path="description" 
      name="description"></form:textarea><br /> 
        <form:errors path="description" cssClass="error" /></td> 
    </tr> 
    <tr> 
     <td class="label">Deadline (dd/mm/yyyy)</td> 
     <td><form:input cssClass="control" path="deadline" 
      name="deadline" type="date" /><br /> 
       <form:errors path="deadline" cssClass="error"></form:errors></td> 
    </tr> 
     ... 

Trong bộ điều khiển tôi đã viết như sau với các lỗi tương tự (và các định dạng khác nhau như "/ MM/dd yyyy ")

@InitBinder 
public void initBinder(WebDataBinder webDataBinder) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
    dateFormat.setLenient(false); 
    webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); 
} 

Tôi cũng đã cố gắng để thêm chú thích trong lớp (cũng với các định dạng khác nhau) nhưng cùng một lỗi

​ ... 
    @Column(name = "deadline") 
    @DateTimeFormat(pattern = "dd/MM/yyyy") 
    private Date deadline; 
    ... 
+0

Đăng mã JSP của bạn. –

+0

Tôi nghĩ, tôi đã phát hiện ra lỗi. Tôi đã thay đổi SimpleDateFormat mới ("dd/MM/yyyy") cho SimpleDateFormat mới ("yyyy-MM-dd") – Joe

+1

Mẫu phải là '" yyyy-MM-dd "'. Cẩn thận với MM (tháng) và mm (phút). –

Trả lời

15

Thêm này trong bộ điều khiển. Thay đổi dateFormat thành tùy chọn ngôn ngữ của bạn.

@InitBinder  
public void initBinder(WebDataBinder binder){ 
    binder.registerCustomEditor(  Date.class,  
         new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true, 10)); 
} 

Xem xét sử dụng các chú thích này trong mô hình của bạn (Thích ứng với định dạng và TemporalType cho sở thích của bạn)

@DateTimeFormat(pattern = "dd/MM/yyyy") 
@Temporal(TemporalType.DATE) 
+0

Cách liên kết này với thông số mẫu của @DateTimeFormat nếu bạn cần cung cấp DateFormat của riêng bạn cho liên kết CustomDateEditor? – Mouscellaneous

+0

@ DateTimeFormat có thể hữu ích nếu bạn bỏ trường này thành chuỗi một lần nữa. Ví dụ. (Chuyển đổi sang XML, Json, v.v.) hoặc chỉ nhận được thuộc tính trong JSP @ Temporal sẽ kiểm soát nếu bạn lưu trữ trường này dưới dạng một trường DATE hoặc DATETIME trong cơ sở dữ liệu. – borjab

+0

@borjab, cảm ơn rất nhiều! Tôi hoàn toàn quên về initBinder ... Bạn đã cứu tôi rất nhiều thời gian! – fromSPb

2

chỉ cần thêm @DateTimeFormat (pattern = "yyyy-MM-dd") với (-)

ví dụ:

@DateTimeFormat(pattern = "yyyy-MM-dd") 
private Date dateNaissance; 
+1

Vâng, tôi nghĩ câu trả lời này là không cần thiết kể từ 2 năm trước. – kaldoran

Các vấn đề liên quan