我是泽西岛的新手(2.22.2),请耐心等待。我正在创建一个与LDAP服务器连接的REST服务,用于存储,删除和检索用户数据。该服务通过执行加密/解密充当安全中介。
在使用REST服务之前必须进行相当多的初始化,并且我只想执行一次初始化(当应用程序部署在服务器上时)。所以这项服务将作为单身人员运行。
如果有人能给我一些关于最佳方法的指示,我将不胜感激?谢谢!
答案 0 :(得分:5)
Jersey 2.22.2具有内置支持,可以改变其资源的生命周期。您可以使用@Singleton
注释。请阅读JAX-RS Application, Resources and Sub-Resources: Life-cycle of Root Resource Classes官方文档中的相关内容。只需将初始化代码放在资源的默认构造函数中即可。
- 范围:Singleton
- 注释:
@Singleton
- 注释完整班级名称:
javax.inject.Singleton
在这个范围内有 每个jax-rs应用程序只有一个实例。单身资源可以 要么用@Singleton注释,要么可以使用注册它的类 应用程序的实例。你也可以创建单身人士 将单例实例注册到Application。
示例:
package com.airhacks;
import java.util.Date;
import javax.inject.Singleton;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
@Path("/hello")
@Singleton
public class HelloWorldService {
public HelloWorldService() throws InterruptedException {
// Some expensive initialization goes here.
Thread.sleep(5000);
System.out.println("Initialized at " + new Date());
}
@GET
public Response getMsg() {
String output = "Hello world at " + new Date();
return Response.status(200).entity(output).build();
}
}
在上面的示例中,由于Glassfish 3上的延迟初始化,第一个请求花了五秒钟,然后立即提供所有后续请求。
答案 1 :(得分:1)
用户Spring框架。
https://projects.spring.io/spring-framework/
https://jersey.java.net/documentation/latest/spring.html
这里有一个完整的工作示例:
https://github.com/jersey/jersey/tree/2.22.2/examples/helloworld-spring-webapp
您基本上将此依赖项添加到您的泽西项目中,它将自动包含Spring:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>${project.version}</version>
</dependency>
然后在名为applicationContext.xml和src / main / resources的文件中定义Spring Bean:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="mySingletonService" class="com.test.MyService"/>
<beans/>
最后但并非最不重要的是,在您的实际资源中,您可以使用@Autowire注释注入此单例服务:
@Path("/resource")
@Component
public class MyResource {
@Autowired
private MyService myService;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getHello() {
return myService.sayHello();
}
}
使用@SingletonResource并在资源中初始化状态是一个可怕的,可怕的想法IMO。关注点分离很重要,将状态保存在REST资源中非常糟糕。通过创建一个LDAPResource和一个LDAPService来分隔处理您的接口(REST)和业务逻辑的代码。 Spring在这里播放的部分只是你必须自己实例化的连线。
答案 2 :(得分:0)
您可以使用@Immediate而非@Singleton,以确保您的服务尽快启动。曾经有一些问题,泽西岛没有默认启动立即上下文,但我认为现在已经解决了