相當新的REST和澤西島,我正在嘗試一些基本的例子。我有一個特別的問題,但我還沒有真正找到答案(不知道如何尋找這個問題):你將如何去存儲/定義共同的服務以便它們是有狀態並且可以訪問所有/某些資源?Java澤西RESTful服務
例如,一個記錄器實例(Log4J或其他)。我是否必須手動初始化並將其存儲在HttpSession中?有沒有一種「最佳實踐」的方式來讓我的記錄器可以訪問所有/某些資源?
相當新的REST和澤西島,我正在嘗試一些基本的例子。我有一個特別的問題,但我還沒有真正找到答案(不知道如何尋找這個問題):你將如何去存儲/定義共同的服務以便它們是有狀態並且可以訪問所有/某些資源?Java澤西RESTful服務
例如,一個記錄器實例(Log4J或其他)。我是否必須手動初始化並將其存儲在HttpSession中?有沒有一種「最佳實踐」的方式來讓我的記錄器可以訪問所有/某些資源?
你最好的選擇是使用類似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>
嚴格說說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;
}
}
關於記錄器的優點。我習慣於將記錄器定義爲單身人士,我忘了他們不必是單身人士,每個資源可以簡單地定義它自己的身份。 – tmbrggmn 2010-05-20 08:59:58