2012-05-07 11 views
4

「springController」で定義されているコントローラで「applicationContext.xml」で定義されたBeanを使用できるようになりました。 xml "、私はこの種のエラーをスキップすることができます。spring-servlet.xmlのBeanがapplicationContext.xml内のBeanにアクセスできない理由

org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/home' defined in ServletContext resource [/WEB-INF/mmapp-servlet.xml]: Cannot resolve reference to bean 'equipementService' while setting bean property 'equipementService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'equipementService' is defined 

applicationContext.xmlを

<?xml version="1.0" ?> 
<!DOCTYPE beans PUBLIC 
"-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 
    <bean name="equipementService" 
     class="mmapp.service.SimpleEquipementService" /> 
    <bean name="equipement1" 
     class="mmapp.domain.Equipement" /> 

</beans> 

mmapp-servlet.xml私は専門家ではないと私は、これが問題になる可能性があるかどうかわからないんだけど、

<?xml version="1.0" ?> 
<!DOCTYPE beans PUBLIC 
"-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 

    <bean name="/home" class="mmapp.web.HelloController"> 
     <property name="equipementService" ref="equipementService" /> 
    </bean> 
</beans> 

答えて

7

Aスプリングベースのウェブアプリケーションは、通常、複数のランタイムSpringアプリケーション・コンテキストを有する -

  1. (サーブレットコンテナの起動時にアップロードされた)ルート・アプリケーション・コンテキスト、ここでここであなたは通常、あなたのサービスのためにあなたの豆を入れて - ルートアプリケーションコンテキストは通常​​、web.xmlファイルにこれらのエントリを使用して、のContextLoaderListenerを使用してアップロードされます。

これは、ディスパッチャサーブレットを使用して構成されたコントローラなど、特別な -
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> 
</context-param> 
UIに関連した豆を保持し、ルートアプリケーションコンテキストの子とみなされ
  1. 、1つの以上のWebアプリケーション・コンテキスト、呼び出しがSpringコンテナに適切に委譲されることを知っているSpringが提供するサーブレット。ルートアプリケーションコンテキスト内のBeanは、ここで定義されたBeanで表示されますが、逆にUIレイヤーとサービスレイヤーの間の分離レベルを提供します。これは、web.xmlファイルの一般的な構成エントリです:あなたは豆をこのように定義している場合

<servlet> 
    <servlet-name>lovemytasks</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/mmapp-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

equipementServiceはあなたのコントローラに表示されるはずです。

+0

私のweb.xmlファイルには、リスナータグ 'ContextLoaderListener'しかありませんでしたが、今度はがあります。 コンテキストファイルには別の奇妙な問題があります。他のBeanで使用する前に常にBeanを宣言する必要があります。 – elaich

+0

はい、Beanを宣言する必要がありますが、これはSpringのアノテーションサポートを使用して非常に簡単に行うことができます。それをブートストラップする以外は明示的な設定が必要ない場合もあります。http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/ beans.html#beans-annotation-config –

1

I提案があります。 Webアプリケーション記述子(web.xml)を投稿できますか?それはコンテキストパラメタを含んでいますか?

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:applicationContext.xml</param-value> 
</context-param> 
関連する問題