Java Spring注入的数据源为空

Java Spring注入的数据源为空,java,spring,tomcat,datasource,jndi,Java,Spring,Tomcat,Datasource,Jndi,我正在尝试使用JdbcTemplate制作DAO。但春天的注射似乎并不顺利。我正在使用来自Tomcat的JNDI注入数据源 另外,我在Tomcats server.xml中编写了设置,在/META-INF中编写了ResourceLink,在web.xml中编写了resource ref,试图在web.xml中添加上下文侦听器,但也没有帮助(实际上,如果我不是从servlet访问数据源,而是仅从DAO访问数据源,我应该添加侦听器吗?) 我错过了什么,为什么春天不注射它 dao-context.xm

我正在尝试使用JdbcTemplate制作DAO。但春天的注射似乎并不顺利。我正在使用来自Tomcat的JNDI注入数据源

另外,我在Tomcats server.xml中编写了设置,在/META-INF中编写了ResourceLink,在web.xml中编写了resource ref,试图在web.xml中添加上下文侦听器,但也没有帮助(实际上,如果我不是从servlet访问数据源,而是仅从DAO访问数据源,我应该添加侦听器吗?)

我错过了什么,为什么春天不注射它

dao-context.xml

 <context:component-scan base-package="somepackage"/>
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/phonebook" expected-type="javax.sql.DataSource"/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>
<Context>
<ResourceLink name="jdbc/phonebook" global="jdbc/global_phonebook" type="javax.sql.DataSource"/>

web.xml

 <resource-ref>
    <description>DatasourceJNDI</description>
    <res-ref-name>jdbc/phonebook</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

数据源JNDI
jdbc/电话簿
javax.sql.DataSource
容器
META-INF/context.xml

 <context:component-scan base-package="somepackage"/>
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/phonebook" expected-type="javax.sql.DataSource"/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>
<Context>
<ResourceLink name="jdbc/phonebook" global="jdbc/global_phonebook" type="javax.sql.DataSource"/>

Tomcat中的server.xml

<Resource name="jdbc/global_phonebook" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/phonebook" username="root" password="1234" maxActive="10" maxIdle="5" maxWait="-1" defaultAutoCommit="false" defaultTransactionIsolation="READ_COMMITTED"/>

tomcat本地主机日志 山猫卡塔利纳原木

与我的工作示例相比,我能看到的唯一区别是,我在Tomcat的context.xml中看到以下内容:

<Resource name="jdbc/MySQL"
            auth="Container"
            type="javax.sql.DataSource"
            username="root"
            password=""
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/so"
            maxActive="8"
            maxIdle="4"/>
抛出NPE,则jdbcTemplate必须为null。你能分享你的DAO代码吗


嗨,米莎,很抱歉回答晚了

我创建了非常简单的控制器进行测试:

@Controller
public class ExecuteController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @RequestMapping(path="execute")
    public String execute() {
        return new Date().toString() + ": executed " + (jdbcTemplate == null);
    }

}
当我执行它时,我得到了

Wed Jan 06 09:22:59 CET 2016:执行错误
false
表示它不是null

我的根上下文为空,servlet上下文为:


因此,将
组件扫描
@Controller
@Autowired
三者结合起来就可以解决这个问题


在现实生活中,我不会从控制器访问JdbcTemplate,而是通过服务层和dao层,但这对于现在来说太复杂了…

与我的工作示例相比,我能看到的唯一区别是,我在Tomcat的context.xml中:

<Resource name="jdbc/MySQL"
            auth="Container"
            type="javax.sql.DataSource"
            username="root"
            password=""
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/so"
            maxActive="8"
            maxIdle="4"/>
抛出NPE,则jdbcTemplate必须为null。你能分享你的DAO代码吗


嗨,米莎,很抱歉回答晚了

我创建了非常简单的控制器进行测试:

@Controller
public class ExecuteController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @RequestMapping(path="execute")
    public String execute() {
        return new Date().toString() + ": executed " + (jdbcTemplate == null);
    }

}
当我执行它时,我得到了

Wed Jan 06 09:22:59 CET 2016:执行错误
false
表示它不是null

我的根上下文为空,servlet上下文为:


因此,将
组件扫描
@Controller
@Autowired
三者结合起来就可以解决这个问题



在现实生活中,我不会从控制器访问JdbcTemplate,而是通过服务层和dao层,但这对于现在来说太复杂了…

我假设,您在日志中没有异常,无法找到数据源,所以我会说问题出在您的注入中?您如何创建DAO,请共享配置。我在第168行有NullPointerException。此行包含jdbcTemplate.getDataSource()方法。打印了dataSource变量,它说它是“null”,就像jdbcTemplate一样。所以我假设JNDI没有被注入。DAOs使用自动连线注释注入,并使用存储库注释定义。已在context.xml中扫描。DAOs注射工程。更新了上下文配置的问题。你能发布stacktrace吗?当然。StackOverflow不允许粘贴,在问题中添加了指向txt的链接我假设,您在日志中没有异常,无法找到数据源,所以我认为问题在于您的注入?您如何创建DAO,请共享配置。我在第168行有NullPointerException。此行包含jdbcTemplate.getDataSource()方法。打印了dataSource变量,它说它是“null”,就像jdbcTemplate一样。所以我假设JNDI没有被注入。DAOs使用自动连线注释注入,并使用存储库注释定义。已在context.xml中扫描。DAOs注射工程。更新了上下文配置的问题。你能发布stacktrace吗?当然。StackOverflow不允许粘贴,添加了问题中的txt链接在server.xml中创建了此资源,我是从/META-INF/context.xml链接到它的,对吗?另外,我在Catalaina日志中发现了另一个错误。可能这是主要问题:java.net.ConnectException:连接被拒绝:康涅狄格在Tomcat的context.xml(不是在web project/META-INF中)中创建了此资源,我没有更改server.xml…似乎在context.xml或server.xml中编写没有关系。你想让我分享刀的哪一部分?它相当大。@Misha:我添加了用于测试的示例配置,请编辑您的问题以指定您是否以不同方式使用它;-)非常感谢你的回答。问题出在我的context.xml文件中,我在每一层中都有几个文件,一些bean被定义了好几次。在清理完所有的工作之后。在server.xml中创建了这个资源,并且我从/META-INF/context.xml链接到它,对吗?另外,我在Catalaina日志中发现了另一个错误。可能这是主要问题:java.net.ConnectException:连接被拒绝:康涅狄格在Tomcat的context.xml(不是在web project/META-INF中)中创建了此资源,我没有更改server.xml…似乎在context.xml或server.xml中编写没有关系。你想让我分享刀的哪一部分?它相当大。@Misha:我添加了用于测试的示例配置,请编辑您的问题以指定您是否以不同方式使用它;-)非常感谢你的回答。问题出在我的context.xml文件中,我在每一层中都有几个文件,一些bean被定义了好几次。清理完所有的工作后。