2013-02-27 30 views
7

Tôi đang cố gắng tạo chú thích @Cached tốt hơn một chút bằng cách làm cho nó nhận biết các tham số của hàm tôi gọi trong bộ điều khiển của mình.kiểm tra kết quả là một playframework ok

vì vậy tôi có hành động này:

public class ContextualCachedAction extends Action<ContextualCached> { 

    @Override 
    public Result call(Context ctx) throws Throwable { 
     try { 
      String key = makeKey(ctx); 
      Integer duration = configuration.duration(); 
      Result result = (Result) Cache.get(key); 
      if (result == null) { 
       result = delegate.call(ctx); 

       //TODO find a way to cache only successful calls 

       Cache.set(key, result, duration); 
      } 
      return result; 
     } catch (RuntimeException e) { 
      throw e; 
     } catch (Throwable t) { 
      throw new RuntimeException(t); 
     } 
    } 

    private String makeKey(Context ctx) { 
     //makes the key from some parameters in the ctx.request() 
    } 
} 

Câu hỏi của tôi là thế này: Tôi muốn để cache kết quả của delegate.call() chỉ nếu nó là một Ok(). Tôi làm cách nào để kiểm tra điều đó? Có tài sản không? một tiện ích? hoặc tôi cần phải Ok(). GetClass(). IsInstance (kết quả)?

Cảm ơn mọi câu trả lời và gợi ý.

PS: Tại sao tôi muốn làm điều đó? Bởi vì tôi có một số cuộc gọi tạo ra vài loại kết quả khác nhau. Vài kết quả đủ để bộ nhớ đệm số họ có thể là một lựa chọn vì tôi không muốn

Trả lời

6

Một ok kết quả thực sự là một kết thúc tốt đẹp play.mvc.Results.Status mà Scala đối tác của play.api.mvc.Results.Status, mà lần lượt có mã status của nó thiết lập để 200.

Vì vậy, bạn gọi số result.getWrappedResult() và kiểm tra xem loại đó có phù hợp không, hãy đặt loại đó là PlainResult (mẫu số chung thấp nhất) và gọi status.

này trông rất xấu xí mặc dù:

play.api.mvc.Result wrappedResult = result.getWrappedResult(); 
    if (wrappedResult instanceof play.api.mvc.PlainResult) { 
    play.api.mvc.PlainResult plainResult = (play.api.mvc.PlainResult)wrappedResult; 
    int code = plainResult.header().status(); 
    if (code == OK) 
     // Cache 
    } 
+0

Điều đó làm việc ... cảm ơn –

+3

Đây có phải là cách được khuyến nghị để thực hiện việc này không? Điều này có vẻ thực sự khó xử và phức tạp để đạt được điều gì đó đơn giản như kiểm tra mã trạng thái phản hồi – knittl

+0

Điều gì xảy ra nếu nó không phải là một thể hiện của 'PlainResult'? – jlars62

2

Nếu bạn biết bạn Result là một thể hiện của play.mvc.Results.Status (mà nó là nếu bạn tạo ra nó bằng bất kỳ phương pháp helper tĩnh từ lớp play.mvc.Results) bạn có thể cast nó để Status, và có được một đối tượng SimpleResult trực tiếp sử dụng getWrappedSimpleResult():

Status result = (Status) YourController.actionHandler(); 
int expected = Results.ok() 
     .getWrappedSimpleResult().header().status(); 
int actual = result.getWrappedSimpleResult().header().status(); 
Assert.assertEquals(expected, actual); 
8

Ít tiếp cận sucky:

import org.junit.*; 
import static org.fest.assertions.Assertions.assertThat; 
import static play.test.Helpers.*; 

/* do stuff */ 

Result result = doSomethingWithController(); 
assertThat(status(result)).isEqualTo(OK); 

Hoạt động theo 2.2.2.

+0

Công trình này hoạt động, nhưng để sử dụng nó trong mã sản xuất (không phải trong mã thử nghiệm), tôi phải giải thích thêm sự phụ thuộc vào thư viện kiểm tra, ví dụ: (để chơi với Java 2.2.1): '" com.typesafe.play "%" play-test_2.10 "%" 2.2.1 "' –

+0

'OK' được xác định ở đâu? –

3

Chỉ cần cập nhật trang này bằng cách thực hiện 2.3+ Playframework mới nhất.

Result result = //..... 
int httpStatus = result.toScala().header().status(); 

đủ dễ dàng.

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