2012-01-04 29 views
2

私はいくつかのサーバーサイド処理を行う既存のSpringアプリケーションを持っています。この特定のアプリケーション用のWebアプリケーションを作成しようとしていて、目的に合うようにSpringMVCを選択しました。* -servlet.xmlとapplicationContext.xmlを組み合わせる

次のように私は、ディスプレイコントローラを作成:

@Controller 
@RequestMapping("/items") 
public class ItemDisplayController { 
    private static final Logger LOGGER = Logger.getLogger(ItemDisplayController.class); 
    private static final String ITEMS_REDIRECT = "redirect:/item/items"; 

    @Autowired 
    private ItemDisplay itemDisplay; 

    @RequestMapping 
    public String listItems(ModelMap model) { 
     if (LOGGER.isInfoEnabled()) { 
      LOGGER.info("List all items"); 
     } 

     List<ItemDetail> itemDetails = itemDisplay.getAllItems(); 
     model.addAttribute("itemDetails",itemDetails); 
     return "items"; 
    } 
} 

私はすでに、次の定義を持つApplicationContextのファイルがあります:私の*のservlet.xmlで

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <bean id="props" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
     <property name="locations"> 
      <array> 
       <value>classpath:item.properties</value> 
       <value>file:#{systemEnvironment['ITEM_HOME']}/item.properties</value> 
       <value>file:#{systemProperties['ITEM_HOME']}/item.properties</value> 
      </array> 
     </property> 
     <property name="ignoreResourceNotFound" value="true"/> 
    </bean> 


    <bean id="itemDisplay" class="com.acme.itemDisplayImpl"> 
      <property name="itemDisplayDAO" ref="jdbcItemDisplayDAO"/> 
     </bean> 

    <bean id="jdbcItemDisplayDAO" class="com.acme.database.dao.JdbcItemDisplayDAO"> 
     <property name="dataSource" ref = "dataSource"/> 
    </bean> 


    <bean id="realDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="#{props['itemds.jdbc.driver']}"/> 
     <property name="url"><value><![CDATA[#{props['itemds.jdbc.url']}]]></value></property> 
     <property name="username" value="#{props['itemds.username']}"/> 
     <property name="password" value="#{props['itemds.password']}"/> 
     <property name="testOnBorrow" value="#{props['itemds.test.on.borrow']}"/> 
     <property name="testWhileIdle" value="#{props['itemds.test.while.idle']}"/> 
     <property name="poolPreparedStatements" value="#{props['itemds.pool.prepared.statements']}"/> 
     <property name="validationQuery" value="#{props['itemds.validation.query']}"/> 
     <property name="validationQueryTimeout" value="#{props['itemds.validation.query.timeout']}"/> 
     <property name="timeBetweenEvictionRunsMillis" value="#{props['itemds.time.between.eviction.runs.millis']}"/> 
     <property name="maxActive" value="#{props['itemds.max.active']}"/> 
     <property name="maxIdle" value="#{props['itemds.max.idle']}"/> 
     <property name="initialSize" value="#{props['itemds.initial.size']}"/> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"> 
     <property name="targetDataSource" ref="realDataSource"/> 
    </bean> 

</beans> 

を、私のようにViewResolverを定義しています

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/mvc 
          http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <mvc:annotation-driven/> 
    <context:annotation-config/> 
    <context:component-scan base-package="com.acme.item"/> 

    <bean id="primaryViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
     <property name="contentType" value="text/html; charset=UTF-8"/> 
     <property name="order" value="1"/> 
    </bean> 
</beans> 

をとweb.xmlで、私はコンテキスト-paramは定義されている次の:私は自分のアプリケーションを実行すると

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5" 
     xmlns="http://java.sun.com/xml/ns/javaee"> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:applicationContext.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>items</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>items</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

、itemDisplayがアップし、それがnull値をアップ示しているデバッガに配線されていません。

私がここで間違っているかもしれないことを誰かが指摘できますか?理想的な世界では、コントローラの@AutowiredでitemDisplayに注釈を付けると、インターフェイスの実装を解決するのに役立ちます。

+0

* servlet.xmlの完全な名前は何ですか? – soulcheck

+0

ログに興味深いものはありますか? – Bozho

+0

@soulcheck - item-servlet.xml –

答えて

1

私がである、のContextLoaderListenerはapplicationContext.xmlをが見つからない場合は、のは、これがクラスパス*を追加してみましょう文句はありません考えることができる唯一の事:applicationContext.xmlをもapplicationContext.xmlをがの時のクラスパスを実行していることを確認してくださいサーバー

ここでは、リソースclasspathの春の良い洞察を提供する優れた記事です。

+0

あなたが提供したリンクは壊れています。 –

+0

申し訳ありませんが、修正しました。 –

1

あなたのファイルはすばやく見えます。コンテキスト内にItemDisplay型のBeanが1つだけ存在する限り、型によってオートワイヤードされる必要があります。そうしないと、ログファイルにエラーが発生します。

あなたの特定の問題とは無関係かもしれない小さなことは、「アイテム」コントローラをweb.xmlのすべてのファイルにマップすることです。

:それは画像などのリソースのために呼び出さないように、これはあなたのApplicationContextファイルのタイプミスであるかどうかわから

1
などと言う* .htmのない - 通常あなたはそれが唯一のファイルの特定のタイプにマップしたいと思います

<bean id="itemDisplay" class="com.acme.itemDisplayImpl"/>

クラスはcom.acme.item.DisplayImplですか?クラスの名前が実際にitemDisplayImplである場合、正しいパッケージを含めるには、*servlet.xmlのコンポーネントスキャン要素を変更する必要があります。