2010-10-21 10 views
0

Je dois obtenir ServletContextResource dans la classe qui implémente InitializingBean, comment est-ce possible? J'ai essayé avec le code suivant, mais il obtient l'expcetion pour ce code.Je dois autowire ServletContextResource dans la classe qui implémente InitializingBean

code:

public class InitBean implements InitializingBean { 
    @Autowired private ServletContextResource context; 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     // load file from WEB-INF folder here 
    } 

} 

répartiteur-servlet.xml:

<!-- InitBean --> 
<bean id="initBean" class="InitBean"> 
<constructor-arg> 
    <value>/WEB-INF/init.properties</value> 
</constructor-arg> 

Exception:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initBean': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.context.support.ServletContextResource InitBean.context; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.web.context.support.ServletContextResource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.context.support.AbstractApplicationContext.initMessageSource(AbstractApplicationContext.java:755) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:413) 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:136) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:224) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 
    at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:185) 
    at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:149) 
    at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:219) 
    at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:164) 
    at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48) 
    at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113) 
    at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89) 

Répondre

1

Je pense que vous êtes mal utilisant ou mal comprendredix .

@Autowired signifie que vous dites printemps pour trouver un bean de type ServletContextResource dans votre contexte (le fichier dispatcher-servlet.xml ou tout autre contexte les fichiers que vous importez), et le fil dans l'instance InitBean. A partir du message d'erreur, vous n'avez aucun ServletContextResource beans dans le contexte, donc cela échoue. Êtes-vous certain de vouloir créer automatiquement un type comme celui-ci?

Au lieu de cela, vous pouvez simplement inject a Resource dans la classe, et avoir le contexte de printemps résoudre des choses comme où le fichier se trouve sur le disque, etc

Il semble que vous êtes sur ce chemin, mais je ne comprends pas pourquoi vous auriez à la fois essayez de configurer le bean avec un constructor-arg du chemin du fichier, puis utilisez @Autowired.

+0

Comment puis-je définir le bean ServletContextResource dans dispatcher-servlet.xml? documentation de printemps n'a aucune mention de cela. – newbie

+0

en regardant bien le [javadoc] (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/context/support/ServletContextResource.html), il ne serait pas si simple à construire. Ma vraie question pour vous, pourquoi prenez-vous la peine d'essayer d'autowire cela? Déclarez simplement votre constructeur pour qu'il prenne une Ressource, puis Spring gèrera la construction d'une ServletContextResource pour votre chemin, et la passera à votre constructeur. Il ne semble pas que vous ayez besoin d'autowiring ici. Dans le code affiché ci-dessus, vous mélangez autowiring avec l'injection d'un chemin de fichier. Vous n'en avez besoin que d'un. –

+0

Comment puis-je prendre des ressources dans le constructeur, pouvez-vous donner un exemple? – newbie