2010-05-10 80 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