2010-03-12 6 views
3

Je suis en train de commencer une application Wicket en utilisant la mise en œuvre Felix de services OSGi HTTP, pour que j'enregistrer juste le paramètre service à l'aide WicketServlet avec applicationClassName:Démarrage application web Wicket avec OSGi service HTTP

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

Je également essayé d'utiliser la mise en œuvre et de l'enregistrement Felix Whiteboard le service Web comme un Servlet:

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

Dans les deux cas, il ne parvient quand je déploie à l'aide de Pax Runner et Felix (mvn package install pax:run -Dframework=felix -Dprofiles=log,config) , L'exception semble être lié à la 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) 
.... 
.... 

J'ai essayé d'exporter tout le bundle et il fait la même chose.

Le plus étrange est que cela fonctionne parfaitement si je l'aide Equinox déploie (mvn package install pax:run -Dframework=felix -Dprofiles=log,config).

Il semble être un problème de visibilty, mais je ne sais pas comment le résoudre, je fais quelque chose de mal? Dois-je essayer d'étendre WicketServlet pour prendre le contrôle sur l'instanciation de l'application? Ou peut-être en utilisant une application Factory?

Mise à jour: Ou peut-être en utilisant une application Factory?

J'ai essayé de régler le paramètre applicationFactoryClassName-ContextParamWebApplicationFactory.class.getName() et n'a pas aidé, à défaut encore avec felix et de travailler avec l'équinoxe.

Toute lumière est la bienvenue.

Répondre

6

Le problème ici est que Wicket semble charger le applicationClass mal. Je n'ai pas regardé le code qui fait ceci, mais je suspecte qu'il emploie le classloader de contexte actuel de fil.

j'ai fait ce qui suit pour surmonter ceci:

  1. Créer ma propre WicketFilter (appelé MyWicketFilter) et passer outre getClassLoader. Cela renvoie this.getClass().getClassLoader().
  2. Enregistrez le MyWicketFilter en tant que service de filtrage pour être détecté par le service http du tableau blanc.

code pour le démarrage activateur:

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

Code pour MyWicketFilter:

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

Vous pouvez également utiliser WicketServlet, mais cela implique primordial newWicketFilter et retour MyWicketFilter d'ici.

+0

Un grand merci, cela a fonctionné, aussi en utilisant WicketServlet :) –

+0

Toute idée pourquoi il ne semble pas fonctionner pour moi? Au lieu du code dans l'activateur, je l'ai défini dans mon site Web.fichier xml: \t \t \t wicket.web-hub \t \t com.hub.web.base.MyWicketFilter \t \t \t \t \t applicationClassName \t \t \t com.hub.web.base.WicketApplication \t \t \t SSV

Questions connexes