拒绝为我的JAX-RS服务提供服务

时间:2013-10-16 16:04:58

标签: java jax-rs cdi

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

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

任何赞赏的例子。

1 个答案:

答案 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();
        }
    }
}