2011-01-13 12 views
1

私は作成している春のWebアプリケーションに基づいて簡単な質問。Spring Web App - 単純なJDBCテンプレートのアドバイス?

どのようにアプリケーションのコンテキストを設定して、simpleJDBCのデータソースパラメータを常に設定する必要はなく、getSimpleJDBCTemplate()。queryfor ....を呼び出すことができますデータソース。

これは私が現在持っている方法で、これは春がすべてのDAOにあるので提供することを意図した制御の反転に反するようです!

ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml"); 
    DataSource dataSource = (DataSource) ac.getBean("dataSource"); 
    SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); 

のApplicationContext

<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" 
      xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

    <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="location" value="classpath:properties.properties"/> 
</bean> 

    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${username}"/> 
     <property name="password" value="${password}"/> 
    </bean> 

<bean name="SimpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
    <constructor-arg><ref bean="dataSource"/></constructor-arg> 
</bean> 


     <context:annotation-config/> 
    </beans> 

最新のスタックトレースのTomcatからすべてのヘルプは 感謝素晴らしいことだ

13-Jan-2011 20:15:18 com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
    ptc.jersey.spring 
13-Jan-2011 20:15:18 com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
    class ptc.jersey.spring.resources.LoginResource 
13-Jan-2011 20:15:18 com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 
13-Jan-2011 20:15:19 com.sun.jersey.spi.spring.container.servlet.SpringServlet getContext 
INFO: Using default applicationContext 
13-Jan-2011 20:15:19 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.4 09/11/2010 10:30 PM' 
13-Jan-2011 20:15:21 com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException 
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container 
java.lang.NullPointerException 
    at ptc.jersey.spring.daoImpl.UserDaoImpl.getUser(UserDaoImpl.java:43) 

web.xmlの

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 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"> 

    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 

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

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:ApplicationContext.xml</param-value> 
</context-param> 


    <servlet> 
     <servlet-name>Jersey Spring Web Application</servlet-name> 
     <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>ptc.jersey.spring</param-value> 
</init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Jersey Spring Web Application</servlet-name> 
     <url-pattern>/resources/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

を記録Chris

+0

web.xmlも投稿してください。 –

+0

それは今それまでです。ありがとうございます – Chris

+0

問題の進捗状況?残念ながら私はアイデアを使い果たしました。何らかの理由で、コンテキストが選択されていない可能性がありますが、configはokです。 –

答えて

5

SimpleJdbcTemplateインスタンスもアプリケーションコンテキストファイルで宣言しないのはなぜですか?

<bean name="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
    <constructor-arg ref="dataSource"/> 
</bean> 

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

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:ApplicationContext.xml</param-value> 
</context-param> 
+0

テンプレートをautowire私のDAOに? – Chris

+0

はい、それをオートワイヤーできるようになります。 –

+0

ありがとうilは、ショットを与える – Chris

2

コンテキストでSimpleJdbcTemplate Beanを宣言し、アプリケーション・コンテキストをロードするためにこれらのBean宣言

<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/> 
    <property name="url" value="dburl"/> 
    <property name="username" value="dbusername"/> 
    <property name="password" value="password"/> 
</bean> 

<bean name="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
    <constructor-arg><ref bean="dataSource"/></constructor-arg> 
</bean> 

そして、あなたのweb.xml内で例えば

このように使用してください:

ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml"); 
SimpleJdbcTemplate simpleJdbcTemplate = (SimpleJdbcTemplate) ac.getBean("jdbcTemplate"); 

またはDAOで:

@Autowired 
private SimpleJdbcTemplate simpleJdbcTemplate; 

それは、スレッドセーフであるため、再利用可能。私はお勧めは何

+0

このアプリケーションでは、私は多くのDAOを持っていますので、各DAOでこれらのコード行がうまくいけば、DAOにJDBCtemplateを提供できるgetterとsetterを持つmianクラスがありますか? – Chris

+0

あなたの状況にあなたのDAOを置き、JdbcTemplateの依存関係を注入させてください。 –

+0

これを試してみましたが、ローカルでは動作しますが、サーバー上で実行されたときにsimpleJdbcTemplateにjava nullポインタ例外がスローされます – Chris

0

は、あなたがそれを必要とし、あなたのクラスにDataSourceを紹介する依存性注入を使用して、あなたのDataSource豆などともクラスを宣言することです。例として、あなたのBean定義は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans">  
    <bean id="dataSource" class="..."> 
    <!-- your dataSource config here --> 
    </bean>  
    <bean id="yourClassThatNeedsDataSource" class="com.stackoverflow.q4684102.Example"> 
    <property name="dataSource" ref="dataSource" /> 
    </bean>  
</beans> 

および添付クラス

package com.stackoverflow.q4684102; 
import javax.jdbc.DataSource; 
import org.springframework.jdbc.core.simple.*; 

public class Example implements YourDaoInterface {  
    private SimpleJdbcOperations jdbc; 

    public void setDataSource(DataSource ds) { 
     jdbc = new SimpleJdbcTemplate(ds); 
    }  
    // your DAO methods here 
} 

をなぜこのよう代わりのSimpleJdbcTemplate自体の外にBeanを作成するには、それを行いますか?

違いはありません。実際には、他の人が好きな人もいれば、このように好きな人もいます。このようにすれば中間オブジェクト用のBean定義がたくさんある巨大なXMLはありません。確かに。もちろん、ソフトウェアの設計方法を決定するのはあなた次第です。

0

setDataSource内にSimpleJdbcTemplateを作成すると、Daoインスタンスごとにテンプレートが作成されます。 Beanとして構成してDaoに注入すると、Daos全体で同じテンプレートを再利用することができます。これはスレッドセーフであるため推奨されます。

関連する問題