试图让Grails 1.3.5使用不使用GORM的JNDI连接

时间:2010-11-22 17:18:15

标签: tomcat grails

我正在尝试配置Grails 1.3.5应用程序以使用JNDI内置到Grails中的默认tomcat实例。该应用程序不使用GORM。我想自己连接到数据源。我正在为我们用于其他应用的模型层使用库。

resources.xml中

和我的bean标题一样:

<import resource="data.xml" />
<import resource="service.xml" /> 

data.xml 中我有:

<bean id="subjectJdbcDao"
    class="uk.co.xxx.dao.subjects.SubjectJdbcDao">
    <property name="dataSource" ref="jobDataSource"/>
</bean>

resources.groovy 我有:

def jobDataSource = new org.springframework.jdbc.datasource.DriverManagerDataSource('oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:@berlin:1521:casdev','cso','job')
   grails.naming.entries = ['jdbc/job':jobDataSource]

我已经尝试了一切,但似乎无法获取data.xml文件来查找jndi数据源。我一直收到这个错误:

    2010-11-22 17:09:38,855 ERROR [context.GrailsContextLoader] Error executing bootstraps: Error 
creating bean with name 'SubjectJdbcDao' defined in URL [file:grails-app/conf/spring/data.xml]: 
Cannot resolve reference to bean 'jobDataSource' while setting bean property 'dataSource'; nested 
exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 
'jobDataSource' is defined
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'SubjectJdbcDao' defined in URL [file:grails-app/conf/spring/data.xml]: Cannot resolve reference to 
bean 'jobDataSource' while setting bean property 'dataSource'; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jobDataSource' is 
defined
        at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)

有谁知道我应该把我的数据源定义放在哪里以便它们被拿起来?

1 个答案:

答案 0 :(得分:2)

您的数据源应该是org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup的一个实例。

如果运行嵌入grails的tomcat,则需要通过在Config.groovy中添加以下条目来模拟JNDI数据源:

grails.naming.entries = ['jdbc/jobDataSource': [
    type: "javax.sql.DataSource", //required
    auth: "Container", // optional
    description: "Data source for ...",
    url: "jdbc:oracle:thin:@berlin:1521:casdev",
    username: "cso",
    password: "job",
    driverClassName: "oracle.jdbc.driver.OracleDriver",
    maxActive: "8", //and so on
    maxIdle: "4"
  ]
]

如果您想将您的应用程序作为战争运行并且需要由tomcat部署和管理的实际JNDI数据源,则需要为您的应用程序创建一个tomcat上下文:

如果您的应用程序是jobapp.war,则必须将jobapp.xml放在TOMCAT_HOME / conf / Catalina / localhost / jobapp.xml下

此jobapp.xml应包含以下内容:

<Context path="/jobapp">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/jobDataSource"
    auth="Container" type="javax.sql.DataSource"
    username="cso"
    password="job"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@berlin:1521:casdev""
    defaultAutoCommit="false"
    <!--
        ... other parameters
    !-->     
          />

我相信这应该可以解决问题 (如果您将其作为战争运行,请确保您的驱动程序可用于您的tomcat安装)

此致

VincentGiguère