属性'dataSource'是必需的java(Spring)错误

时间:2014-02-10 07:50:20

标签: java spring datasource

我正在 Java(Spring)中开发一个Web应用程序

我的java文件是,

try
    {
        JdbcTemplate jt = new JdbcTemplate(dataSource);

        System.out.println("Connection ....."+jt.toString());

        Connection conn;
        Statement st;
        conn =DriverManager.getConnection(jt.toString());
        conn = (Connection) jt.getDataSource();
        st=conn.createStatement();
        System.out.println("Connection created....."+st);
    }
    catch (Exception e) {
         System.out.println("Error Found...."+ e.getMessage());
         System.out.println("Strack Trace....."+e.getStackTrace());
    }

我的 spring-servlet.xml 文件为,

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/cjbranchdb" />
    <property name="username" value="root" />
    <property name="password" value="root" />
</bean>
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource"><ref bean="dataSource"/></property> 
</bean> 

但是它会出错,

Error Found: Property 'dataSource' is required.
Strack Trace: [Ljava.lang.StackTraceElement;@7948dd

在这里,我想在Java文件中建立连接,并将其作为Jasper Report传递给另一个变量。

请帮助,如何解决此问题?

3 个答案:

答案 0 :(得分:7)

我猜你是Java,JEE,Spring和JDBC的新手。正如我在评论中所述,很难回答你的问题,如果你在那里所做的事情在其基础上是不正确的。我将尝试讨论一些主题,并希望能够确定您当前问题的位置。

Spring应用程序结构

您需要确保正确构建项目:

  • src
    • main
      • java - Java源代码目录
        • in/mmali/springtest/controller/IndexController.java - 您的控制器类
      • resources - 非Java(重新)源的目录
      • webapp - 用于Web应用程序资源的root
        • WEB-INF/web.xml - JEE Web应用程序配置
        • WEB-INF/spring-servlet.xml - 调度程序servlet的应用程序上下文配置
  • pom.xml - Maven配置(如果您使用的是Maven)

我认为这是Java项目的一个通用结构,大多数是由Maven“标准化”。

更正JEE配置

您需要具有正确的web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd" version="3.0"> 

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

    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

这是一个基本配置(没有根上下文),它将使用spring-servlet.xml作为Spring上下文配置。

更正弹簧配置

您需要具有正确的Spring上下文配置:

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

    <!-- With ROOT context we would restrict component scan on controllers here -->
    <context:component-scan base-package="in.mmali.springtest" />

    <!-- Data source configuration would normally go inside ROOT context. -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/cjbranchdb" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
        <property name="dataSource" ref="dataSource" />
    </bean> 
</beans>

这将加载所有使用@Component(及其随播广告@Controller@Service@Repository)注释的类作为您的bean。 Spring应用程序上下文中的 Bean 是Spring管理的对象 - &gt;即由Spring本身实例化的对象。当您想使用Spring bean时,需要注入它(例如使用@Autowired注释),或者需要手动将其从ApplicationContext#getBean中取出。

使用JDBC

使用JDBC对所有可关闭的资源和已检查的异常都很痛苦。这就是Spring-JDBC项目包装JDBC API的原因,因此您不必使用它。

为了展示如何使用JDBC以及如何让Spring注入依赖项,这里是一个简单的控制器:

@Controller // Will be detected by <context:component-scan>
@RequestMapping // Will be detected by <mvc:annotation-driven> (more specifically by one of its component - RequestMappingHandlerMapping)
public class IndexController {

    @Autowired // Spring will inject JdbcTemplate here
    private JdbcOperations jdbcOperations; 

    @RequestMapping // This method should be called for requests to "/" 
    @ResponseBody // Returned string will be returned to client... normally you would register view resolver and just return name of a JSP to render
    public String renderIndex() {
        // You don't need to worry about JDBC's DataSource, Connection, ResultSet, ... just use JdbcTemplate
        long rowCount = jdbcOperations.queryForLong("SELECT COUNT(*) FROM my_test_table;");
        return "Number of rows in database is: " + String.valueOf(rowCount);
    } 

}

请注意,在实际应用程序中,您不允许控制器直接使用您的数据源,而是通过服务和数据层。

后续步骤

  • 开始使用日志记录系统,再也不要在Web应用程序中使用System.out.println;)。我建议的 SLF4J 的与启动它的简单绑定(以后你可以配置它使用的的logback 的或的log4j 的)。
  • 配置您的应用程序以使用交易。使用Spring的事务处理(<tx:annotation-driven/>@Transactional)。起初它可能看起来很神奇,但是当你发现有关AOP和代理类的东西时,你会开始真正地了解Spring的工作原理。
  • 将应用程序逻辑拆分为服务层和数据(DAO)层。
  • 检查Spring的示例应用程序http://docs.spring.io/docs/petclinic.html)和参考应用程序(https://github.com/spring-projects/greenhouse)。

答案 1 :(得分:0)

JdbcTemplate jt = new JdbcTemplate(dataSource);你不能只使用new关键字来构造一个bean对象。显然,该对象中的引用将为null。

相反,你应该问spring给你那个bean对象。有点像这样。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-servlet.xml");
JdbcTemplate jt = (JdbcTemplate)context.getBean("JdbcTemplate");

在这种情况下,spring将注入依赖关系,即配置中给出的datasource

答案 2 :(得分:0)

根据文件名,我假设您正在构建基于Web的应用程序。

要捕获错误,请使用正确的日志框架而不是System.out.println。

根据错误,dataSource似乎为null。请检查 web.xml 是否已定义servlet xml文件,例如

<servlet>
    <servlet-name>spring_app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/spring-servlet.xml</param-value>
  </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

此外,DriverManagerDataSource仅适用于测试。对于生产用途,请考虑Apache的Jakarta Commons DBCP或C3P0。详见官方webpage

由于您的XML文件已提及

<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource"><ref bean="dataSource"/></property> 
</bean> 

,XML文件应该包含一个servlet部分,用于调用id = JdbcTemplate的对象。例如,

<bean id="MyServlet" class="com.my.MyServlet"> 
    <property name="jdbcTemplate"><ref bean="JdbcTemplate"/></property> 
</bean>