public class ShoppingApplication extends Application {
  private Set<Object> singletons = new HashSet<>();
  private Set<Class<?>> classes = new HashSet<>();
  public ShoppingApplication() {
    classes.add(CustomerResourceService.class);
    classes.add(JAXBMarshaller.class);
    classes.add(JSONMarshaller.class);
    singletons.add(new CustomerResourceService());
  }
  @Override
  public Set<Class<?>> getClasses() {
    return classes;
  }
  @Override
  public Set<Object> getSingletons() {
    return singletons;
  } 
}
Suppose I have above code which I extends Application and register my resources or providers to set. I want to know how can I dynamically inject my resources to set in runtime, my web application will create several new resources in runtime and need to inject to Application inorder to use.
JAX-RS is an specification (just a definition) and Jersey is a JAX-RS implementation. Jersey framework is more than the JAX-RS Reference Implementation. Jersey provides its own API that extend the JAX-RS toolkit with additional features and utilities to further simplify RESTful service and client development.
The Resource class is what your are looking for. Just mind it's a Jersey specific API.
According to the documentation, the Resource class is the main entry point to the programmatic resource modeling API that provides ability to programmatically extend the existing JAX-RS annotated resource classes or build new resource models that may be utilized by Jersey runtime.
Have a look at the example provided by the documentation:
@Path("hello")
public class HelloResource {
     @GET
     @Produces("text/plain")
     public String sayHello() {
         return "Hello!";
     }
}
// Register the annotated resource.
ResourceConfig resourceConfig = new ResourceConfig(HelloResource.class);
// Add new "hello2" resource using the annotated resource class
// and overriding the resource path.
Resource.Builder resourceBuilder =
        Resource.builder(HelloResource.class, new LinkedList<ResourceModelIssue>())
        .path("hello2");
// Add a new (virtual) sub-resource method to the "hello2" resource.
resourceBuilder.addChildResource("world")
        .addMethod("GET")
        .produces("text/plain")
        .handledBy(new Inflector<Request, String>() {
                @Override
                public String apply(Request request) {
                    return "Hello World!";
                }
        });
// Register the new programmatic resource in the application's configuration.
resourceConfig.registerResources(resourceBuilder.build());
The following table illustrates the supported requests and provided responses for the application configured in the example above:
  Request              |  Response        |  Method invoked
-----------------------+------------------+----------------------------
   GET /hello          |  "Hello!"        |  HelloResource.sayHello()
   GET /hello2         |  "Hello!"        |  HelloResource.sayHello()
   GET /hello2/world   |  "Hello World!"  |  Inflector.apply()
For additional details, check the Jersey documentation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With