Jersey application mit dynamischen Resourceladen

Hi,

ich habe eine Jersey webapplication, die verschiedene REST Schnittstellen via Plugins anbietet.

Meine bisherige Lösung war, eine UI zu haben, die ich per war file auf tomcat deploye und die “eigentliche” Funktionalität (Backend - REST Schnittstellen) als Standalone server laufen lasse.

Dort habe ich es so gemacht, dass die Plugins (jars) per ServiceLoader geladen werden und dann der Server damit gestartet wird

private void startServer() {
	ResourceConfig resourceConfig = loadEndpoints();
	resourceConfig.register(JacksonFeature.class);
        // org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer
	httpServer = createHttpServer(URI.create(serverUrl), resourceConfig);
}

// load all plugins
private ResourceConfig loadEndpoints() {
	ResourceConfig resourceConfig = new ResourceConfig();
        // wrapper für einen simplen ServiceLoader. Alle REST Schnittstellen implementieren das Interface IntegrationEndpoint
	serviceLoader.loadIntegrations(IntegrationEndpoint.class, resourceConfig::register);
	return resourceConfig;
}

Das laeuft alles auch so wie es soll, der Server wird gestartet mit allen plugins geladen, d.h. ich kann über die UI die dynamisch geladenen Schnittstellen erreichen.

Nun find ich es aber unhandlich einen eignen Server fürs Backend laufen zu lassen und die Idee ist nun, dass das Backend auch als war auf den selben Applicationserver deployed wird, wie die UI, also nur ein server, aber mit versch. Applications.

Und daran scheitere ich nun, das Backend so zu schreiben, dass mir die Ressourcen dynamisch geladen werden.

Ich habe zum Beispiel folgende Resource

public class TeamEndpoint implements IntegrationEndpoint {
  @GET
  @Path("get")
  @Produces(MediaType.TEXT_PLAIN)
  public String getTeams() {
     return "ALL TEAMS";
  }
}

die in ein jar gepackt wird und ins Filesystem abgelegt wird.

Meine backend application (wird als “backend” auf Tomcat deployed), nun soll diese beim Start laden und registrieren, mein bisheriger Versuch sieht so aus

@WebListener
public class IntegrationServer extends ResourceConfig implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
    LOGGER.info(() -> "CONTEXT INIT");
    try {
        register(JacksonFeature.class);
        // wrapper for the ServiceLoader implementation
        this.serviceLoader = new IntegrationServiceLoader();
       this.serviceLoader.loadIntegrations(IntegrationEndpoint.class, gce -> {
            LOGGER.info(() -> "Adding " + gce.getClass() + " to Server");
            register(gce.getClass());
        });
    }
    catch (IOException e) {
        LOGGER.log(Level.SEVERE, e, () -> "Failed to init integration server");
    }
}
}```
Ich sehe ihm log, dass er registriert, aber der Aufruf **http://localhost:8080/backend/team/get** führt zu einem 404.

Meine web.xml ist recht simpel



Jersey Web Application
org.glassfish.jersey.servlet.ServletContainer
1


Jersey Web Application
/*



Wenn ich die Resource von oben direkt in dem Backend projekt habe und dann in der web.xml diese angebe, so wird sie korrekt geladen und registriert.

**TL;DR**: Wie kann ich in einer laufenden Web application Jersey rest service/resourcen dynamisch registrieren ?