2012-06-29 16 views
6

Tôi nhận được lỗi này:Sử dụng mẫu JSON trong Chơi 2.0

Compilation error [package views.json.Runs does not exist]

khi nó rõ ràng không tồn tại. Tôi không thể hiểu được tôi có thể làm gì sai.

hành động trong bộ điều khiển Runs:

@BodyParser.Of(play.mvc.BodyParser.Json.class) 
public static Result view(Long task_id, Long run_id) { 
    Run run = Run.find.byId(run_id); 
    return ok(views.json.Runs.view.render(run)); 
} 

app/views/Runs/view.scala.json:

@(run: Run) 

{ 
    "started": "@run.started", 
    "completed": "@run.completed" 
} 

Tôi đã nhận được một vài html mẫu làm việc, nhưng đây là mẫu JSON đầu tiên tôi đã thử với 2.0 . Tôi không chắc những gì khác để thử vì nó đã về cơ bản càng tốt. Ai có ý tưởng gì không?

Cập nhật: Tôi đã nhận được một số đề xuất cho giải pháp, nhưng tôi vẫn muốn biết cách làm cho các mẫu hoạt động, nếu chỉ hiểu rõ hơn về các thay đổi đối với 2.0.

Trả lời

7

Chỉ html, xml và txt xuất hiện được hỗ trợ theo mặc định. Đối với các phần mở rộng và định dạng tệp khác, bạn phải đăng ký thêm "templateTypes" trong $PLAY_HOME/framework/src/sbt-plugin/src/main/scala/PlaySettings.scala (xem thêm: SBT Settings, gần phía dưới).

Có thể hữu ích khi xem các định nghĩa loại mẫu chuẩn nằm trong số $PLAY_HOME/framework/src/play/src/main/scala/play/api/templates/Templates.scala.

Bạn cũng có thể gian lận và phục vụ json của mình từ tệp txt, nhưng thực hiện response().setContentType("application/json") trước khi gọi phương thức render.

+0

Công việc tuyệt vời tìm một tham chiếu vững chắc để sao lưu câu trả lời của bạn. Đó là kết luận như tôi có thể hy vọng. –

3

Đối Json, tại sao bạn không trực tiếp sản xuất ra một chuỗi Json sử dụng Json helper:

public static Result view(Long task_id, Long run_id) { 
    Run run = Run.find.byId(run_id); 
    return ok(play.libs.Json.toJson(run)); 
} 
+0

Tôi đã cố gắng tránh lỗi đệ quy vô hạn mà tôi nhận được. Trong 'Run' tôi đã có' @ManyToOne (cascade = CascadeType.MERGE) nhiệm vụ tác vụ công cộng; 'và trong' Task' tôi có danh sách công khai '@OneToMany (mappedBy =" task ", fetch = FetchType.LAZY) chạy; '. Rất có thể tôi đang làm điều gì sai ở đó nhưng tôi vẫn chưa tìm ra điều gì. –

+2

Nó không phải là một thực hành tốt để có mối quan hệ hai chiều. Thay vào đó, hãy viết một phương thức "getRuns()" trong Bean tác vụ, tạo một truy vấn SQL để truy xuất "Chạy". –

+0

Tôi đã loại bỏ trường 'Task.runs', nhưng phép đệ quy vô hạn vẫn xảy ra khi phương thức' getRuns' tồn tại. Công trình tìm thấy nếu tôi loại bỏ các phương pháp quá. Bất kỳ ý tưởng về điều đó? –

2

Tôi khuyên bạn làm theo các tài liệu và để cho các thư viện Json serialize dữ liệu của bạn thay vì viết văn bản Json trên của riêng bạn : See Serving Json Response.

+0

Chào mừng bạn đến với Stack Overflow. Vì các liên kết có xu hướng thay đổi nên bạn được khuyến khích đưa các trích đoạn có liên quan từ trang được liên kết cùng với liên kết. –

+0

Oh cảm ơn. Đây là tài liệu được phiên bản chính thức của họ, vì vậy điều đó khá an toàn, nhưng tôi sẽ nhớ để làm điều đó vào lần sau (aka quá lười ngay bây giờ)!:-) –

0

Tôi vẫn không hiểu, tại sao mọi người muốn hiển thị JSON của họ bằng lượt xem.

Lưu ý: đây là cách tương tự như @nico_ekito cho thấy trước và tôi đồng ý với ông hoàn toàn, bên dưới mã chỉ cho thấy làm thế nào để chọn một phần của đối tượng cho JSON

public static Result view(Long task_id, Long run_id){ 

    Run run = Run.find.byId(run_id); 

    ObjectNode result = Json.newObject(); 
    result.put("started", run.started); 
    result.put("completed", run.completed); 

    return ok(Json.toJson(result)); 

} 
+2

Nó có lợi ích nhất quán khi html và/hoặc xml cũng được hỗ trợ và cho phép Play tự động trả lời ở định dạng chính xác. –

+0

Mất các lợi ích khi bạn đặt JSON vào mẫu, vì bạn cần phải lo lắng về mọi dấu phẩy, dấu hai chấm, dấu ngoặc kép, v.v. Tôi đã thử nó một lần và không bao giờ nữa;) đặc biệt là tôi muốn tạo API thực sự lớn. vòng lặp, vòng lặp, trong vòng lặp. Tất nhiên bằng cách sử dụng ObjectNode bạn cũng cần phải lặp lại một cái gì đó, đôi khi, nhưng bạn không cần phải tìm kiếm các mẫu cho khung bị lãng quên. – biesior