JAX-RS Jersey, как динамически добавлять ресурсы или поставщиков в приложение

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

Предположим, что у меня есть код, который расширяет приложение и регистрирую мои ресурсы или поставщиков для установки. Я хочу знать, как я могу динамически вводить свои ресурсы для установки во время выполнения, мое веб-приложение создаст несколько новых ресурсов во время выполнения, и вам нужно будет внедрить приложение Inorder для использования.

Ответ 1

Программный API для создания ресурсов

Класс Resource - это то, что вы ищете. Просто имейте в виду специфический API в Джерси.

Согласно документации, класс Resource является основной точкой входа в API моделирования программных ресурсов, который обеспечивает возможность программно расширять существующие классы ресурсов аннотированных JAX-RS или создавать новые модели ресурсов, которые могут использоваться во время выполнения Джерси.

Посмотрите пример, представленный в документации:

@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 configuration.
resourceConfig.registerResources(resourceBuilder.build());

В следующей таблице показаны поддерживаемые запросы и предоставлены ответы для приложения, настроенного в приведенном выше примере:

  Request              |  Response        |  Method invoked
-----------------------+------------------+----------------------------
   GET /hello          |  "Hello!"        |  HelloResource.sayHello()
   GET /hello2         |  "Hello!"        |  HelloResource.sayHello()
   GET /hello2/world   |  "Hello World!"  |  Inflector.apply()

Дополнительные сведения см. в документации Jersey.