相当新的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