2010-05-10 141 views
3

相當新的REST和澤西島,我正在嘗試一些基本的例子。我有一個特別的問題,但我還沒有真正找到答案(不知道如何尋找這個問題):你將如何去存儲/定義共同的服務以便它們是有狀態並且可以訪問所有/某些資源?Java澤西RESTful服務

例如,一個記錄器實例(Log4J或其他)。我是否必須手動初始化並將其存儲在HttpSession中?有沒有一種「最佳實踐」的方式來讓我的記錄器可以訪問所有/某些資源?

回答

2

你最好的選擇是使用類似Spring的服務注入資源。在您的資源中爲特定服務添加一個設置器使其可用於各種範圍。以下tutorial詳細說明如何使用Spring和Jersey。以下是進行這項工作所需的各個部分的示例。具體回答你的問題,然而「最佳實踐」是允許Spring管理特定服務的「有狀態」或「範圍」。

簡單服務豆

public class SimpleBean { 
    private int counter; 
    public String sayHello() { 
     return Integer.toString(counter++); 
    } 
} 

簡單的JAX-RS資源

public class HelloWorldResource { 

    private SimpleBean simpleBean; 

    public void setSimpleBean(SimpleBean simpleBean) { 
     this.simpleBean = simpleBean; 
    } 

    @GET @Path("/Hello") @Produces(MediaType.APPLICATION_JSON) 
    public String sayHello() { 
     return "{\"Hello\": \"" + this.simpleBean.sayHello() + "\"}"; 
    } 
} 

簡單的彈簧applicationContext.xml中,注意爲bean和資源的 「範圍」。這定義了這些對象的狀態。

<bean id="simpleBean" scope="prototype" class="myhealth.spring.SimpleBean"/> 

<bean id="helloWorldResource" scope="singleton" class="myhealth.ajax.HelloWorldResource"> 
    <property name="simpleBean"> 
     <ref bean="simpleBean"/> 
    </property> 
</bean> 
2

嚴格說說Logger,你確定你想讓它成爲有狀態的嗎?我一直在做的大多數項目只需在任何課程需求中抓取一個

Logger log = Logger.getLogger(this.getClass().getName()); 

剪切和粘貼到處,讓日誌魔法開始!

關於保持狀態的原始問題:您是否希望在應用程序中保持每個用戶(如會話)或某個其他狀態的狀態(如運行時配置的記錄器)?會話可以通過HttpRequest和一些ServletFilter進行管理。抓住像這樣

@Path("/awesome") 
public class AwesomeService { 

    @GET 
    @Produces("text/awesome") 
    public String getAwesome(@Context HttpServletRequest req) { 
     HttpSession session= req.getSession(true); 
     //brilliance 
    } 
} 

應用資源在你的球衣代碼請求,像一個實體管理器或konfabulator可以靜態初始化並作爲單身或工廠。

class EntityManager { 
EntityManager manager; 
public static EntityManager getManager() { 
     if(manager == null) { 
      manager = initManager(); 
     } 
     return manager; 
    } 
} 
+0

關於記錄器的優點。我習慣於將記錄器定義爲單身人士,我忘了他們不必是單身人士,每個資源可以簡單地定義它自己的身份。 – tmbrggmn 2010-05-20 08:59:58