Ich denke, dies ist eine sehr feine Nuance des dokumentierten Verhalten von ServletContainer
, wenn es nicht gar Fehler ist. Die ServletContainer
docs zum Thema Init-Parameter lesen als:
Alle Initialisierungsparameter werden als Eigenschaften der erstellten ResourceConfig hinzugefügt.
Die Antwort ist dort versteckt. Insbesondere, wenn die ResourceConfig-Instanz nicht vom ServletContainer erstellt wird, werden die Servlet-Initialisierungsparameter nicht als Eigenschaften hinzugefügt und haben daher keinen Einfluss auf die Konfiguration Ihrer App. Wenn Sie Ihre eigene Application
Instanz liefern, wie Sie mit dem new ServletContainer(application)
hat, folgt die Initialisierung etwa diesen Kurs:
Ihr Code ruft den folgenden ServletContainer
Konstruktor mit Application
Beispiel:
public ServletContainer(Application app) {
this.app = app;
}
Der Behälter Ihre ServletContainer
initialisiert als Teil eines typischen Servlet
Lebenszyklus:
protected void init(WebConfig webConfig) throws ServletException {
webComponent = (app == null)
? new InternalWebComponent()
: new InternalWebComponent(app);
webComponent.init(webConfig);
}
Es geht Ihre Application
Instanz in den InternalWebComponent
Konstruktor. Ein InternalWebComponent
ist nur eine leichte Anpassung von WebComponent
, so:
InternalWebComponent(Application app) {
super(app);
}
Anrufe:
public WebComponent(Application app) {
if (app == null)
throw new IllegalArgumentException();
if (app instanceof ResourceConfig) {
resourceConfig = (ResourceConfig) app;
} else {
resourceConfig = new ApplicationAdapter(app);
}
}
Hier, da Sie eine Application
Instanz direkt zur Verfügung gestellt wird ein ResourceConfig
in einer der für Sie gebaut Zweige dieser Sekunde if
.Unmittelbar nach dem Bau wird WebComponent.init()
an der neuen Komponente aufgerufen (siehe oben unter ServletContainer.init()
, woher wir kamen). Innerhalb dieser init()
Aufruf ist, wo die "erstellt ResourceConfig" durch die Dokumente wird erstellt werden, aber in Ihrem Fall, existiert bereits eine, wie durch die Spur gezeigt, die wir folgten, um hier zu erhalten. Das heißt, die resourceConfig
nicht null, so dass die wichtige Linie unten nicht ausgeführt:
public void init(WebConfig webConfig) throws ServletException {
...
if (resourceConfig == null)
resourceConfig = createResourceConfig(config);
...
}
Das createResourceConfig()
Methode (noch in WebComponent
) lautet wie:
private ResourceConfig createResourceConfig(WebConfig webConfig)
throws ServletException {
final Map<String, Object> props = getInitParams(webConfig);
final ResourceConfig rc = createResourceConfig(webConfig, props);
rc.setPropertiesAndFeatures(props);
return rc;
}
Sie in diesem Anruf sehen Das setPropertiesAndFeatures()
wird verwendet, um die Initparameter des Servlets in die ResourceConfig
Instanz zu kopieren. Leider ist dies der nur Ort, an dem dieser Aufruf gemacht wird, und in Ihrem Fall, Ausführung macht es hier nie, im Grunde wegen Ihrer Verwendung eines der nicht-Standard ServletContainer
Konstruktoren.
Ich erwarte, dass die ursprünglichen Autoren ServletContainer
mit nur einem Konstruktor no-arg geschrieben haben und die anderen zwei wurden später für die einfache Verwendung mit Servlet 3.0-Containern hinzugefügt, ohne zu erkennen, dass dieses Verhalten eingeführt wurde. Ansonsten würde ich erwarten, einige Erwähnung davon in den Dokumenten zu sehen.
So lange Geschichte kurz: entweder die Standard-ServletContainer
Konstruktor verwenden oder einen Weg zu kümmern diesem Teil finden sich:
Map<String, Object> props = getInitParams(webConfig);
rc.setPropertiesAndFeatures(props);
Der erste Weg ist wahrscheinlich die einfachste. Zum Beispiel könnten Sie Ihre Application
Klasse als init-Parameter angeben, auch, solange es gibt nichts, die Sie auffordert, es zu instanziieren vor der Zeit, wie zum Beispiel:
servletHolder.setInitParameter("javax.ws.rs.Application", "org.foo.MyApplication");
diese Weise der „normale“ Initialisierung Pfad genommen werden, was bedeutet, dass die WebComponent
die ResourceConfig
für Sie erstellt und die init-Parameter korrekt anwenden.
Ihr Code scheint mit einer XML-Servlet-Konfiguration identisch zu sein, abgesehen von einem Detail - dem Servlet-Namen und der Servlet-Klasse. Vielleicht hast du diese Portion hier einfach nicht eingefügt. Haben Sie diese XML-Konfigurationslösung ausprobiert und bestätigt, dass sie tatsächlich in Ihrem Fall funktioniert? – Cebence
Haben Sie die JDK-Protokollierung entsprechend konfiguriert? – skirsch
@Cebence 'ServletHolder' dient als' web.xml'. Die Anwendung läuft und es funktioniert. – nobeh