0

拒绝为我的 JAX-RS 服务提供服务的最佳方式是什么?

我需要实例化几个单例,但无法使用 CDI@Startup注释启动它们。所以我想在对任何POSTGET方法的初始请求时实例化它们。实例化这些 bean 后,我会将服务标记为可用。

任何例子表示赞赏。

4

1 回答 1

2

当会话 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();
        }
    }
}
于 2013-10-16T23:19:55.300 回答