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 @Prototype 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;
}