2013-06-21 25 views
7

Tôi có một ngày (dưới dạng một chuỗi) đang được gửi. Tôi muốn ánh xạ điều này đến một đối tượng lệnh. Tôi đã nhìn xung quanh một chút và không tìm thấy nguồn tài nguyên tuyệt vời nào về cách lập bản đồ này trong một đối tượng lệnh đến một ngày thực.ngày kết thúc đối tượng lệnh trong Grails

Nếu tôi đã làm điều này trong bộ điều khiển chính nó tôi chỉ có thể làm như sau, tuy nhiên điều này không cho phép tôi dễ dàng ánh xạ vào đối tượng lệnh của tôi.

def endDate = params.date('endDate', 'MM/dd/yyyy') 

Đối với đối tượng lệnh của tôi, gần nhất tôi có thể nhận được là ghi đè lên getter và setter cho đối tượng ngày. Cả hai cần phải được ghi đè hoặc người khác setter không được sử dụng. Đây là những gì tôi đã thử lần đầu tiên (đặt String thành Date, nhưng lấy Date). Vì vậy, điều này không sử dụng setter:

@grails.validation.Validateable 
class TaskCreateCommand { 

    Date startDate 


    public void setStartDate(String dateStr){ 
     this.start = Date.parse('MM/dd/yyyy', dateStr) 
    } 

} 

Điều này không cung cấp bất kỳ vấn đề thời gian chạy nào, nhưng vô dụng vì tôi không thể rút đối tượng Ngày thực tế.

@grails.validation.Validateable 
class TaskCreateCommand { 

    Date startDate 


    public void setStartDate(String dateStr){ 
     this.start = Date.parse('MM/dd/yyyy', dateStr) 
    } 

    public String getStartDate(){ 
     return start.toString() 
    } 
} 
+0

Câu trả lời có hữu ích không? – dmahapatro

Trả lời

6

Đồng thời, tôi đã xem xét cùng một vấn đề ngay hôm nay và theo dõi this câu trả lời từ @Don. Tôi đã có thể ràng buộc một ngày đúng với đối tượng lệnh.

@Validateable 
class BookCommand { 
    String name 
    Date pubDate 
    Integer pages 
} 

//Controller 
def index(BookCommand cmd) { 
     println cmd.name 
     println cmd.pages 
     println cmd.pubDate 

     render "Done" 
    } 

//src/groovy 
class CustomDateEditorRegistrar implements PropertyEditorRegistrar { 
    public void registerCustomEditors(PropertyEditorRegistry registry) { 
     String dateFormat = 'yyyy/MM/dd' 
     registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true)) 
    } 
} 

//URL 
http://localhost:8080/poc_commandObject/book?name=Test&pages=10&pubDate=2012/11/11 

//Println 
Test 
10 
Sun Nov 11 00:00:00 EST 2012 
+0

Dhiraj, Grails chọn cái nào nếu bạn tạo nhiều 'CustomDateEditorRegistrar'? –

12

Nếu bạn đang sử dụng Grails 2.3 hoặc mới hơn, bạn có thể thêm nhiều định dạng ngày tùy chỉnh cho dữ liệu ràng buộc trong Config.groovy bạn

grails.databinding.dateFormats = ["MM/dd/yyyy"] 

Sau đó, khi Grails cố gắng để ràng buộc các thông số yêu cầu chỉ huy các thuộc tính đối tượng, định dạng tùy chỉnh của bạn sẽ được thử khi phân tích cú pháp chuỗi ngày trong các tham số yêu cầu ví dụ.

class MyController { 
    def myAction(MyCommandObject cmd) { 
     println cmd.date 
     println cmd.date.class 
    } 
} 

class MyCommandObject { 
    Date date 
} 

sau đó khi bạn nhấn ví dụ.

http://localhost:8080/myController/myAction?date=12/13/2013 

bạn sẽ thấy một cái gì đó như thế nào ->

Fri Dec 13 00:00:00 EST 2013 
class java.util.Date 

trên giao diện điều khiển của bạn.

+0

Cách tốt nhất để xử lý điều này cho phiên bản Grails sớm hơn 2.3 là gì? –

+0

Bạn sẽ phải đăng ký trình chỉnh sửa ngày tùy chỉnh của riêng mình, công việc này hơi hơn một chút. Kiểm tra http://stackoverflow.com/questions/2871977/binding-a-grails-date-from-params-in-a-controller để biết chi tiết. Nó mở rộng thêm một chút về cách làm điều đó hơn là câu trả lời được chấp nhận ở đây. – AndrewW

+0

Tốt hơn nên tạo một ValueConverter từ StringToDate như sau: http://stackoverflow.com/a/29552305/568179 (và nó là sự nhận biết của miền địa phương;)) – mpccolorado

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