拒绝为我的 JAX-RS 服务提供服务的最佳方式是什么?
我需要实例化几个单例,但无法使用 CDI@Startup
注释启动它们。所以我想在对任何POST
或GET
方法的初始请求时实例化它们。实例化这些 bean 后,我会将服务标记为可用。
任何例子表示赞赏。
当会话 bean 使用@Singleton
和不使用注释时,该 bean 在首次使用@Startup
时被初始化,由容器管理。所以这不是要走的路。
但是,您可以在应用程序范围内拥有一个资源 bean 。只要 Web 应用程序运行,资源就会保持状态。
@ApplicationScoped
@Path("single")
public class SingleResource {
private boolean activated;
@GET
@Path("activate")
public Response activate() {
activated = true;
return Response.ok("Service Activated", MediaType.TEXT_PLAIN_TYPE)
.build();
}
@GET
@Path("deactivate")
public Response deactivate() {
activated = false;
return Response.ok("Service Deactivated", MediaType.TEXT_PLAIN_TYPE)
.build();
}
@GET
public Response foo() {
if (activated) {
return Response.ok("Service Available", MediaType.TEXT_PLAIN_TYPE)
.build();
} else {
return Response.status(Response.Status.SERVICE_UNAVAILABLE)
.entity("Service Unavailable")
.type(MediaType.TEXT_PLAIN_TYPE)
.build();
}
}
}
如果您需要资源 bean 与单个 HTTP 请求-响应周期一样长,在请求范围内,也可以使用单例会话 bean。例如:
@Singleton
public class SingleBean {
private boolean activated;
public boolean isActivated() {
return activated;
}
public void setActivated(boolean activated) {
this.activated = activated;
}
}
和资源:
@Path("foo")
@Stateless
public class FooResource {
@EJB
private SingleBean dummyBean;
@GET
@Path("activate")
public Response activate() {
dummyBean.setActivated(true);
return Response.ok("Service Activated", MediaType.TEXT_PLAIN_TYPE)
.build();
}
@GET
@Path("deactivate")
public Response deactivate() {
dummyBean.setActivated(false);
return Response.ok("Service Deactivated", MediaType.TEXT_PLAIN_TYPE)
.build();
}
@GET
public Response foo() {
if (dummyBean.isActivated()) {
return Response.ok("Service Available", MediaType.TEXT_PLAIN_TYPE)
.build();
} else {
return Response.status(Response.Status.SERVICE_UNAVAILABLE)
.entity("Service Unavailable")
.type(MediaType.TEXT_PLAIN_TYPE)
.build();
}
}
}