2010-11-19 3 views
2

Je travaille sur une application web Spring MVC, qui utilise un serveur HTTP Jetty, qui contient une WebAppContextSpring MVC avec Jetty - qu'est-ce qui est supposé aller dans le fichier app-servlet.xml?

<bean id="Server" class="org.mortbay.jetty.Server" init-method="start" 
    destroy-method="stop"> 
    <property name="connectors"> 
     <list> 
      <bean id="Connector" class="org.mortbay.jetty.nio.SelectChannelConnector"> 
       <property name="port" value="9531" /> 
      </bean> 
     </list> 
    </property> 

    <property name="handler"> 
     <bean id="handlers" class="org.mortbay.jetty.handler.HandlerCollection"> 
      <property name="handlers"> 
       <list> 
        <bean id="contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection"> 
         <property name="handlers"> 
          <list> 
           <bean class="org.mortbay.jetty.webapp.WebAppContext"> 
            <property name="contextPath" value="/" /> 
            <property name="war" value="/etc/WebContent" /> 
            <!-- <property name="copyWebDir" value="true" /> --> 
           </bean> 
          </list> 
         </property> 
        </bean> 
       </list> 
      </property> 
     </bean> 
    </property> 
</bean> 

J'essaie de savoir où les haricots sont censés définir. Il y a essentiellement deux choix: mon fichier de configuration Spring spécifique à l'application (appelez-le "myApp-context.xml") ou le fichier de configuration Spring de la servlet (appelez-le "myApp-servlet.xml"). La section pertinente du fichier web.xml est la suivante:

<servlet-mapping> 
    <servlet-name>myApp</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:jeff/myApp-context.xml</param-value> 
</context-param> 

Jusqu'ici, tout va bien. Basé sur d'autres questions/réponses, je mets des choses comme mes résolveurs de vue Spring MVC (qui sont directement liés à la webapp) dans myApp-servlet.xml, et d'autres beans spécifiques aux applications comme DAO, utilitaires de droits, etc. context.xml (qui est donné comme "contextConfigLocation" dans web.xml). Cela fonctionne bien, l'application démarre et tout est injecté correctement, les contrôleurs Spring MVC fonctionnent bien, etc.

Ce que j'ai remarqué, cependant, c'est que tous les beans définis dans myApp-servlet.xml (qui, selon convention, doit exister dans le répertoire racine web étant donné que mon nom de servlet est "myApp") sont chargés par Spring deux fois. Plus précisément, il y a un message de journal comme "Initialiser Spring FrameworkServlet 'myApp'", après quoi tous les beans qui étaient dans myApp-servlet.xml sont à nouveau chargés. Si je déplace tous ces beans de myApp-servlet.xml vers myApp-context.xml, en laissant myApp-servlet.xml vide (en ouvrant et en fermant des tags), l'application démarre avec succès (plus vite cette fois) et ne ne pas créer chaque haricot deux fois. Cependant, le WebAppContext de Jetty semble insister sur l'existence d'un fichier myApp-servlet.xml (s'il n'en existe pas, l'application ne démarre pas). Il requiert également que contextConfigLocation soit défini et pointe vers un fichier de configuration Spring valide.

Quelqu'un peut-il m'aider à trier ma configuration? Laisser myApp-servlet.xml dépourvu de toute définition de bean semble juste parce que l'application démarre plus vite et sans initialisation de bean redondante, mais mal parce que le contexte de l'application web semble exiger qu'il existe. Mettre des beans dans myApp-servlet.xml est correct parce que sinon il serait vide, mais mauvais parce que maintenant ces beans sont initialisés deux fois, le démarrage prend plus de temps, et le choix des beans à mettre là semble arbitraire de toute façon. Merci pour toute aide, et plus de détails/extraits peuvent être fournis au besoin.

Modifier: il est maintenant clair pour moi la raison pour laquelle ces deux sont différents. myApp-servlet.xml est un fichier de configuration Spring spécifique à un servlet. Donc, si cette servlet est une servlet Spring MVC, il faut mettre les contrôleurs, etc. dans ce fichier. On pourrait aussi avoir myApp2-servlet.xml et myApp3-servlet.xml, en définissant deux autres servlets dans le même conteneur. Tout cela aura naturellement des haricots indépendants les uns des autres (puisque ce sont des applications web totalement séparées). D'autre part, le fichier myApp-context.xml contient les définitions de beans qui seront fournies à chaque servlet. C'est pourquoi les services publics DB, les droits, etc., comme l'a souligné Neeme Praks, devraient figurer dans ce fichier. Il est fort probable que chaque application web, tout en étant totalement séparée dans sa présentation et sa fonction, devra utiliser des utilitaires communs. C'est l'endroit pour définir ces haricots "communs".

Répondre

1

En général, vous avez une configuration correcte:

  • myApp-servlet.xml doit contenir directement des haricots liés webapp-
  • myApp-context.xml doivent contenir les grains de logique métier (par exemple OTI, les services publics de droits et privilèges)

En ce qui concerne la raison, pourquoi vos beans webapp-connexes sont chargés deux fois - ne sais pas. Ils ne doivent pas être chargés deux fois. Peut-être que vous êtes en lisant le journal incorrect? Peut-être qu'il y a une erreur de configuration qui n'est pas évident à partir des extraits de configuration que vous avez fournis (plein web.xml, myApp-servlet.xml et myApp-context.xml serait utile)?

Voir aussi:

+0

Merci - Je vois le problème est que j'inclus myApp-servlet.xml (avec myApp-context.xml) comme valeur pour la propriété contextConfigLocation dans web.xml. Cela entraîne évidemment le chargement de ces fèves deux fois. Malheureusement, lorsque je n'inclus pas myApp-servlet.xml dans contextConfigLocation, j'ai un problème différent (les contrôleurs Spring MVC ne détectent pas les requêtes), donc je vais devoir en rajouter un peu plus. –

Questions connexes