Resource installer

CoreInstallersBundle / ResourceInstaller

Installs rest resources.

Recognition

Detects classes annotated with jax-rs @Path annotation and register them as rest resources. Guice will manage resource creation, so you may think of it as usual guice bean.

@Path("/res")
@Produces('application/json')
class SampleResource {

    @Inject
    private MyService service;

    @GET
    @Path("/sample")
    public Response sample() {
        return Response.ok(service.result()).build();
    }
}

Resources registered as singletons, when no explicit scope annotation is used. Behaviour could be disabled with option:

.option(InstallerOptions.ForceSingletonForJerseyExtensions, false)

Special @Protptype scope annotation may be used to mark resources in prototype scope. It is useful when guice servlet support is disabled (and so @RequestScoped could not be used).

Interface recognition

Class will also be recognized if @Path annotation found on directly implemented interface.

@Path("/res")
@Produces('application/json')
interface ResourceContract {

    @GET
    @Path("/sample")
    String sample();
}

class SampleResource implements ResourceContract {

    @Inject
    private MyService service;

    @Override
    public Response sample() {
        return Response.ok(service.result()).build();
    }
}

Annotations on interfaces are useful for jersey client proxies

Client client = ClientBuilder.newClient();
ResourceContract resource = WebResourceFactory
    .newResource(ResourceContract.class, client.target("http://localhost:8080/"));

// call sample method on remote resource http://localhost:8080/res/sample
String result = resource.sample();

Jersey client proxies requires extra dependency org.glassfish.jersey.ext:jersey-proxy-client

Request scope bindings

If you need request scoped objects, use Provider:

class SampleResource {

    @Inject
    private Provider<HttpServletRequest> requestProvider;

    @GET
    @Path("/sample")
    public Response sample() {
        HttpServletRequest request = requestProvider.get();
        ...
    }

See jersey objects, available for injection.

@Context usage

@Context annotation usage is a common point of confusion. You can't use it for class fields:

this will not work

public class MyResource {
    @Context UriInfo info;
}

Use provider instead:

correct way

public class MyResource {
    @Inject Provider<UriInfo> infoProvider;
}

But, you can use @Context on method parameters:

public class MyResource {
    @GET
    public Response get(@Context UriInfo info) { ... }
}

Jersey managed resource

If resource class is annotated with @JerseyManaged then jersey HK2 container will manage bean creation instead of guice. Injection of guice managed beans could still be possible via registered HK2-guice-bridge, but guice aop features will not work.

Note

You can manage resources with HK2 by default, but this will also affect all jersey extensions

@Path("/res")
@Produces('application/json')
@JesreyManaged
class SampleResource {
    ...
}

@Context annotation on field will work on HK2 managed bean:

@Path()
@JerseyManaged
public class MyResource {
    @Context UriInfo info;
}