2011-05-26 97 views
33

我正在尋找一個好的REST tutorial using Jersey。 下跌的一頁,有其名稱爲TodoResource它本身包含兩個實例變量Jersey - 注入的@Context註釋。它是如何工作的?

public class TodoResource { 
    @Context 
    UriInfo uriInfo; 

    @Context 
    Request request; 

    String id; 

    public TodoResource(UriInfo uriInfo, Request request, String id) { 
     this.uriInfo = uriInfo; 
     this.request = request; 
     this.id = id; 
    } 
} 

是內置的Web資源,我想知道UriInfoRequest實例變量究竟是如何初始化?我知道使用@Context註釋允許注入信息,但是在什麼時候會發生?這將由澤西島自動處理嗎?

+3

我不知道的細節,但沒錯,澤西它將自動初始化這些變量爲你在幕後。如果您需要了解其工作原理的詳細信息,請在Eclipse中將「觀察點」放在其中一個變量上,這會告訴調試器在變量被修改時中斷。然後,您可以查看堆棧跟蹤並查看Jersey類正在修改它。 – MatrixFrog 2011-05-26 21:24:47

+0

好的。我會放棄這一點。感謝您的幫助 – Joeblackdev 2011-05-27 10:13:21

回答

20

新澤西不修改類,但它從客戶端的每個請求創建它。

之後調用類構造函數,注入上下文字段。
(你應該嘗試訪問構造函數中的這些領域,他們將null

在你的情況下,該類不需要特定的構造,所以才:

public TodoResource() { 
    // in most cases the ctor stays empty. 
    // don't do much work here, remember: the ctor is invoked at every client request 
} 

但是這裏面的方法(代表網絡資源)註釋爲@POST, @GET, ...,您將有權訪問上下文字段。

26

我碰到的一些有趣的結果與Rules of Injection,這裏就是我發現:

public class TodoResource{ 
    @Context 
    UriInfo uriInfo; // Set second 
    public TodoResource(@Context UriInfo value){ 
    uriInfo = value; // Set first (makes sense) 
    } 
    @Context 
    public void setUriInfo(UriInfo value){ 
    uriInfo = value; // Set third 
    } 
} 

我希望這有助於。

+0

這段代碼的確有用,謝謝邁克。 – kazy 2015-06-19 23:07:24

16

使用@PostConstruct方法註釋:

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 

@Path("foo") 
public class AuthResource { 
    @Context 
    HttpServletRequest request; 

    public AuthResource() { 
     //request is null 
    } 

    @PostConstruct 
    public void postConstruct() { 
     //request is NOT null 
    } 

    @PreDestroy 
    public void preDestroy() { 
     //after rest method executing 
    } 
}