Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAX-RS Jersey, how to dynamic adding resources or providers to Application

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.

like image 591
Vincent Mao Avatar asked Nov 12 '14 08:11

Vincent Mao


People also ask

Is Jax and Jersey RS the same?

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.


1 Answers

Programmatic API for building resources

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.

like image 54
cassiomolin Avatar answered Oct 07 '22 00:10

cassiomolin