拒绝为JAX-RS服务提供服务的最佳方法是什么?
我需要实例化几个单例,但无法使用CDI @Startup
注释启动它们。
所以我想在初次请求任何POST
或GET
方法时实例化它们。
一旦这些bean被实例化,我将把服务标记为可用。
任何赞赏的例子。
答案 0 :(得分:2)
当会话bean使用@Singleton
和不注释@Startup
时,bean会在首次使用上初始化,由容器管理。所以这不是要走的路。
但是,您可以在应用程序范围中拥有资源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。 e.g:
@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();
}
}
}