2010-10-21 3 views
0

Мне нужно получить ServletContextResource в классе, который реализует InitializingBean, как это возможно? Я пробовал со следующим кодом, но он получил эксплоит для этого кода.Мне нужно autwire ServletContextResource в классе, который реализует InitializingBean

Код:

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

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

} 

диспетчер-servlet.xml:

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

Исключение:

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) 

ответ

1

Я думаю, что вы неправильно использование или неправильное понимание @Autowired.

@Autowired означает, что вы рассказываете Spring найти боб типа ServletContextResource в вашем контексте (файл dispatcher-servlet.xml или любой другой контекст файлы вы импортируете), и провод его в экземпляр InitBean.

Из сообщения об ошибке у вас нет никаких фанов ServletContextResource в контексте, поэтому это не удается.

Вы действительно хотите авторизоваться таким образом? Вместо этого вы можете просто ввести inject a Resource в класс, а контекст Spring разрешить такие вещи, как файл, находящийся на диске, и т. Д.

Похоже, вы на этом пути, но я не понимаю, почему вы оба попытайтесь настроить компонент с помощью constructor-arg пути к файлу, а затем используйте @Autowired.

+0

Как я могу определить компонент ServletContextResource в dispatcher-servlet.xml? весенняя документация не упоминает об этом. – newbie

+0

хорошо смотря на [javadoc] (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/context/support/ServletContextResource.html), это не было бы так просто построить. Мой реальный вопрос к вам, почему вы пытаетесь это сделать? Просто объявите свой конструктор в Ресурс, а затем Spring обработает построение ServletContextResource для вашего пути и передаст его вашему конструктору. Кажется, вам вообще не нужно автоуслуги. В вышеприведенном коде вы смешиваете autowiring с вводом пути к файлу. Вам нужен только один. –

+0

Как я могу взять ресурс в конструкторе, можете ли вы привести пример? – newbie