2012-01-04 73 views
2

我有一個現有的Spring應用程序,它執行一些服務器端處理。我正在嘗試爲這個特定的應用程序創建一個webapp,並選擇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文件:

<?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> 

在我* 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-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中,我定義了上下文參數:

<?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沒有連線並且在調試器上顯示爲空值。

有人可以指出我可能在這裏做錯了嗎?在理想的世界中,我會假設在控制器中使用@Autowired註釋itemDisplay將有助於解析接口的實現。

+0

* servlet.xml的全名是什麼? – soulcheck 2012-01-04 15:33:21

+0

日誌中有趣的事情? – Bozho 2012-01-04 15:34:00

+0

@soulcheck - 它是item-servlet.xml – 2012-01-04 15:51:17

回答

1

我能想到的只有一點,ContextLoaderListener的不抱怨,如果沒有找到applicationContext.xml中,讓我們試試這個添加的classpath *:applicationContext.xml的也確保applicationContext.xml的運行時類路徑服務器

這是一篇很好的文章,提供了一個很好的洞察彈簧classpath資源。

+0

您提供的鏈接已損壞。 – 2012-01-08 00:36:16

+0

對不起,修正了它。 – 2012-01-08 01:50:59

1

您的文件在快速瀏覽時看起來很好。只要在上下文中只有一個具有ItemDisplay類型的bean,它應該按類型自動裝配,否則應該在日誌文件中出現錯誤。

我注意到的一件小事,可能與您的特定問題無關,是您將'items'控制器映射到web.xml中的所有文件。通常你會希望它映射到特定類型的文件只有 - 說的* .htm,這樣就不會被調用的資源,如圖片等

1

不知道這是你的applicationContext文件錯字:

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

不應該是com.acme.item.DisplayImpl?類。如果類的名稱確實是itemDisplayImpl,那麼您需要更改*servlet.xml中的組件掃描元素以包含正確的包。