Printemps 3.1 WebApplicationInitializer & Jetty Embarqué 8 AnnotationConfiguration
Je suis en train de créer une simple application web sans aucune configuration XML à l'aide de Printemps 3.1 et embarque une Jetée 8 serveur.
Cependant, j'ai du mal à obtenir de la Jetée à reconnaître mes implementaton du Printemps WebApplicationInitializer interface.
Structure de projet:
src
+- main
+- java
| +- JettyServer.java
| +- Initializer.java
|
+- webapp
+- web.xml (objective is to remove this - see below).
La Initialiseur classe ci-dessus est une simple mise en œuvre de WebApplicationInitializer:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.springframework.web.WebApplicationInitializer;
public class Initializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.out.println("onStartup");
}
}
De même JettyServer est une simple mise en œuvre d'un serveur Jetty embarqué:
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext;
public class JettyServer {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setResourceBase("src/main/webapp");
webAppContext.setContextPath("/");
webAppContext.setConfigurations(new Configuration[] { new AnnotationConfiguration() });
webAppContext.setParentLoaderPriority(true);
server.setHandler(webAppContext);
server.start();
server.join();
}
}
Ma compréhension est que sur le démarrage de la Jetée utilisera AnnotationConfiguration pour le balayage des
annoté implémentations de ServletContainerInitializer; il doit trouver Initialiseur et de fil en...
Cependant, lorsque je démarre le serveur Jetty (depuis Eclipse) je vois le suivant sur la ligne de commande:
2012-11-04 16:59:04.552:INFO:oejs.Server:jetty-8.1.7.v20120910
2012-11-04 16:59:05.046:INFO:/:No Spring WebApplicationInitializer types detected on classpath
2012-11-04 16:59:05.046:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/duncan/Coding/spring-mvc-embedded-jetty-test/src/main/webapp/}
2012-11-04 16:59:05.117:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
L'important est ceci:
No Spring WebApplicationInitializer types detected on classpath
Noter que src/main/java est défini comme un dossier source dans Eclipse, il doit donc être dans le classpath. À noter également que la Dynamique Module Web Facette est défini à la section 3.0.
Je suis sûr qu'il ya une explication simple, mais j'ai du mal à voir la forêt pour les arbres! Je crois que la clé est avec la ligne suivante:
...
webAppContext.setResourceBase("src/main/webapp");
...
Ce sens avec un 2.5 servlet utilisant web.xml (voir ci-dessous), mais que devrait-il être lors de l'utilisation de AnnotationConfiguration?
NB: Tout s'allume correctement si je change les Configurations suivantes:
...
webAppContext.setConfigurations(new Configuration[] { new WebXmlConfiguration() });
...
Dans ce cas, il trouve le web.xml sous src/main/webapp et l'utilise pour fil de la servlet utilisant DispatcherServlet et AnnotationConfigWebApplicationContext de la manière habituelle (complètement ignorant la WebApplicationInitializer de mise en œuvre ci-dessus).
Cela ressemble beaucoup à un problème de classpath, mais j'ai du mal à comprendre comment la Jetée s'associe avec des implémentations de WebApplicationInitializer - toutes les suggestions sont les plus appréciés!
Pour info, je suis en utilisant les suivantes:
Printemps 3.1.1
Jetée 8.1.7
STS 3.1.0
Vous devez vous connecter pour publier un commentaire.
Le problème est que la Jetée du
AnnotationConfiguration
classe ne comprend pas d'analyse non-pot de ressources sur le chemin de la classe (sauf sous WEB-INF/classes).Il trouve mon
WebApplicationInitializer
's si j'enregistre une sous-classe deAnnotationConfiguration
qui remplaceconfigure(WebAppContext)
pour analyser l'hôte classpath en plus du conteneur et web-inf endroits.La plupart de la sous-classe est (malheureusement) copier-coller à partir de la mère. Il comprend:
parseHostClassPath
) à la fin de la méthode configure ();parseHostClassPath
méthode qui est essentiellement de copier-coller à partir deAnnotationConfiguration
'sparseWebInfClasses
;getHostClassPathResource
méthode qui attire le premier non-jar URLà partir du chargeur de classe (qui, pour moi, au moins, est l'url du fichier à ma
classpath dans eclipse).
Je suis en utilisant des versions légèrement différentes de la Jetée (8.1.7.v20120910) et le Printemps (de 3.1.2_RELEASE), mais j'imagine que la même solution.
Edit: j'ai créé un exemple de projet sur github, avec quelques modifications (le code ci-dessous fonctionne bien à partir d'Eclipse, mais pas lors de l'exécution dans l'ombre d'un bocal) - https://github.com/steveliles/jetty-embedded-spring-mvc-noxml
Dans le cas des OP JettyServer classe le changement nécessaire de remplacer la ligne 15 avec:
Mise à jour: Jetty 8.1.8 introduit des changements internes qui sont incompatibles avec le code ci-dessus. Pour 8.1.8 la suite semble fonctionner:
J'ai été en mesure de résoudre plus facilement, mais plus limitée en fournissant simplement explicitement à la AnnotationConfiguration la mise en œuvre de la classe (MyWebApplicationInitializerImpl dans cet exemple) que je veux être chargé comme ceci:
WebAppContext.getWebInf()
toujoursreturn newResource("target");
au lieu de{resourceBase}/WEB-INF/classes/
.WebXmlConfiguration
est nécessaire pour permettre à l'Embarcadère pour servir de ressources (comme le HTML et le CSS danssrc/main/webapp
). Voir aussiWebAppContext#setResourceBase()
.Jetée 9.0.1 contient une amélioration qui permet de numériser des annotations de non-pot de ressources (c'est à dire des classes) sur le conteneur classpath. Voir le commentaire n ° 5, la question de comment l'utiliser:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=404176#c5
Jan
Le code ci-dessous a fait le tour de mon projet maven:
Basé sur mes tests et ce fil http://forum.springsource.org/showthread.php?127152-WebApplicationInitializer-not-loaded-with-embedded-Jetty je ne pense pas que cela fonctionne pour le moment. Si vous regardez dans AnnotationConfiguration.configurer:
il semble couplé à une guerre, comme le déploiement plutôt que de les incorporer.
Voici un exemple d'utilisation de Spring MVC et intégré de la Jetée, qui pourraient être plus utiles:
http://www.jamesward.com/2012/08/13/containerless-spring-mvc
Il crée le Printemps servlet directement, plutôt que de compter sur les annotations.
À ceux qui connaissent cette dernièrement, il semble que cela permet de contourner le problème:
Pour le faire fonctionner sur la Jetée de 9 attributs du jeu de AnnotationConfiguration.CLASS_INHERITANCE_MAP sur WebAppContext
Et ici est de savoir comment créer cette carte:
J'ai placé cette solution sur gitHub
Qu'en est seulement le contexte de l'attribut qui indique au scanner de choses qui doivent figurer sur le récipient classpath qui doivent être numérisés?
contexte de l'attribut:
org.eclipse.la jetée.serveur.webapp.ContainerIncludeJarPattern
./servlet-api-[^/].jar$
Il est conçu pour être utilisé avec pot de noms, mais vous pourriez tout simplement correspondre à tout.
Vous avais besoin d'utiliser la WebInfConfiguration ainsi que la AnnotationConfiguration classes.
cheers
Jan
Dans notre cas, ces lignes ont contribué à la Jetée de code de démarrage:
Jetée 9 version de "magomarcelo" réponse:
Pour Jetty 9, si vous avez webjars, la solution proposée ne fonctionne pas tout de suite que ces Pots ont besoin d'être dans le classpath et le POT contenus doivent être disponibles en tant que ressources pour votre webapp. Donc, pour que cela fonctionne ensemble avec webjars, la config devrait être:
L'ordre ici est important (WebInfConfiguration doit venir avant MetaInf).
Solution qui a fonctionné pour moi, et n'implique pas de la numérisation, mais utilise WebApplicationInitializer classe que vous fournissez. La jetée de version: 9.2.20
La source (en russe) de cet extrait de code est ici: https://habrahabr.ru/post/255773/
fait un simple projet maven pour démontrer comment il peut être fait proprement.
et c'est tout le printemps WebApplicationInitializer que vous utilisez détectés sans explicitement laissant serveur jetty savoir à propos de l'existence d'une telle application de l'initialiseur.