3

OSGi HTTPサービスのFelix実装を使用してWicketアプリケーションを開始しようとしています。そのため、パラメーターを使用WicketServletしてサービスを登録するだけです。applicationClassName

props.put("applicationClassName", MainApplication.class.getName());
service = (HttpService)context.getService(httpReference);
service.registerServlet("/", new WicketServlet(), props, null);

また、Felixホワイトボードの実装を使用してWebサービスをServlet1つとして登録してみました。

props.put("alias", "/");
props.put("init.applicationClassName", MainApplication.class.getName());
registration = context.registerService(Servlet.class.getName(), new WicketServlet(), props);

どちらの場合も、Pax RunnerとFelix(mvn package install pax:run -Dframework=felix -Dprofiles=log,config)を使用してデプロイすると失敗しますが、例外はClassLoader:に関連しているようです。

[Jetty HTTP Service] ERROR org.apache.felix.http.whiteboard - Failed to register servlet
org.apache.wicket.WicketRuntimeException: Unable to create application of class es.warp.sample.HTTPLocalGUI.MainApplication
....
....
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
....
....

バンドル内のすべてをエクスポートしようとしましたが、同じように動作します。

最も奇妙なことは、Equinox()を使用してデプロイすると完全に機能することmvn package install pax:run -Dframework=felix -Dprofiles=log,configです。

目に見える問題のようですが、修正方法がわかりません。何か間違ったことをしているのでしょうか。WicketServletアプリケーションのインスタンス化を制御するために拡張を試みる必要がありますか?または、アプリケーションファクトリを使用していますか?

更新:または、アプリケーションファクトリを使用していますか?

applicationFactoryClassNameパラメータを設定しようとしましたが、ContextParamWebApplicationFactory.class.getName()役に立ちませんでしたが、それでもfelixで失敗し、equinoxで動作していました。

どんな光でも大歓迎です。

4

1 に答える 1

6

ここでの問題は、WicketがapplicationClassを正しくロードしていないように見えることです。これを行うコードは調べていませんが、現在のスレッドのコンテキストクラスローダーを使用していると思われます。

私はこれを克服するために次のことをしました:

  1. 自分でWicketFilter(と呼ばれるMyWicketFilter)を作成し、オーバーライドしますgetClassLoader。これはを返しますthis.getClass().getClassLoader()
  2. MyWicketFilterホワイトボードhttpサービスによってピックアップされるフィルターサービスとしてを登録します。

アクティベーター開始のコード:

Hashtable<String, String> props = new Hashtable<String, String>();
props.put("pattern", "/.*");
props.put("init.applicationClassName", MyApplication.class.getName());

final MyWicketFilter service = new MyWicketFilter();
context.registerService(Filter.class.getName(), service, props);

MyWicketFilterのコード:

public final class MyWicketFilter
    extends WicketFilter
{
    @Override
    protected ClassLoader getClassLoader()
    {
        return this.getClass().getClassLoader();
    }
}

を使用することもできますが、これには、ここからMyWicketFilterWicketServletをオーバーライド して返すことが含まれます。newWicketFilter

于 2010-03-18T22:48:24.927 に答える