私はそれが完全にバグではありませんならば、これはServletContainer
の文書化行動の非常に微妙なニュアンスだと思います。初期化パラメータの対象となるServletContainer
docsは、
となります。すべての初期化パラメータは、作成されたResourceConfigのプロパティとして追加されます。
回答はそこに隠されています。具体的には、ServletContainerによってResourceConfigインスタンスが作成されない場合、サーブレットのinitパラメータはプロパティとして追加されないため、アプリケーションの構成には影響しません。
が
あなたのコードは、あなたのApplication
インスタンスに次ServletContainer
コンストラクタを呼び出します:
public ServletContainer(Application app) {
this.app = app;
}
コンテナはあなたのServletContainer
などを初期化し、あなた自身のApplication
インスタンスを提供する場合、あなたがnew ServletContainer(application)
で行ったように、初期化は大体この経過をたどります
protected void init(WebConfig webConfig) throws ServletException {
webComponent = (app == null)
? new InternalWebComponent()
: new InternalWebComponent(app);
webComponent.init(webConfig);
}
あなたのはそこに行く:典型的なServlet
ライフサイクルの一部インスタンスをInternalWebComponent
コンストラクタに挿入します。
InternalWebComponent(Application app) {
super(app);
}
呼び出し:
public WebComponent(Application app) {
if (app == null)
throw new IllegalArgumentException();
if (app instanceof ResourceConfig) {
resourceConfig = (ResourceConfig) app;
} else {
resourceConfig = new ApplicationAdapter(app);
}
}
これは、あなたが直接Application
インスタンスを提供するので、ResourceConfig
のいずれかであなたのために構築され、あるInternalWebComponent
はちょうどわずかなのでWebComponent
のカスタマイズ、ありますその2番目の枝if
。構築直後に、新しいコンポーネントに対してWebComponent.init()
が呼び出されます(上記のServletContainer.init()
呼び出しを参照してください)。このinit()
の中には、ドキュメントによって参照される "作成されたResourceConfig"がに作成されますが、あなたのケースでは、私たちがここにたどるトレイルに示すように、既に存在します。すなわち、resourceConfig
はnullではないので、以下の重要な行は実行されません:
public void init(WebConfig webConfig) throws ServletException {
...
if (resourceConfig == null)
resourceConfig = createResourceConfig(config);
...
}
それcreateResourceConfig()
方法を(まだWebComponent
に)として読み込む:あなたはそのコールに見ることができます
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;
}
setPropertiesAndFeatures()
を使用してサーブレットのinitパラメータをResourceConfig
インスタンスにコピーします。残念ながら、これはの呼び出しが行われた場所であり、デフォルトではServletContainer
のコンストラクタを使用しているため、実際には実行されません。
元の作者は、この動作が導入されていることを知らないうちに、Servlet 3.0コンテナでの使いやすさのために、後で追加された1つの引数のないコンストラクタを使用してServletContainer
を書きました。さもなければ、私はの一部をと言います。
だから、長い話を短く:デフォルトServletContainer
コンストラクタを使用するか、この部分のことは自分を世話をする方法を見つけるのいずれか:
Map<String, Object> props = getInitParams(webConfig);
rc.setPropertiesAndFeatures(props);
最初の方法は、おそらく最も簡単です。たとえば、次のような、限り、事前にそれをインスタンス化するためにあなたを必要とする何もないとして、あまりにも、初期化パラメータとしてごApplication
クラスを指定することができます、
servletHolder.setInitParameter("javax.ws.rs.Application", "org.foo.MyApplication");
「ノーマル」の初期化パスをそのようになりますWebComponent
がResourceConfig
を作成し、initパラメータを正しく適用することを意味します。
あなたのコードは、サーブレット名とクラスという1つの詳細を除いて、XMLサーブレットの設定と同等に見えます。多分あなたはちょうどその部分をここに貼り付けなかったでしょう。 XML設定ソリューションを試してみたことがありますか? – Cebence
JDKロギングを適切に設定しましたか? – skirsch
@Cebence 'ServletHolder'は' web.xml'として機能します。アプリケーションが実行され、動作します。 – nobeh