【问题标题】:java.lang.IllegalArgumentException: Property 'dataSource' is requiredjava.lang.IllegalArgumentException:需要属性“数据源”
【发布时间】:2017-05-06 09:08:25
【问题描述】:

我正在开发 Spring MVC 应用程序。尝试运行应用程序时出现以下异常:

java.lang.IllegalArgumentException: Property 'dataSource' is required

我尝试关注 stackverflow 中的其他帖子并基于 commnets 实现,但没有解决问题。请找到以下文件:

Servlet-Context.xml

<beans:bean id="SearchResultsServiceDAOImpl"  class="com.easyFinder.app.ServiceDAOImpl.SearchResultsServiceDAOImpl">
          <beans:property name="dataSource"  ref="dataSource" />    
</beans:bean>

<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
    <beans:property name="username" value="sysman"/>
    <beans:property name="password" value="orcl"/>
</beans:bean>  

SearchresultsServiceDAOImpl.java

private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public String enterIntoNewEntrytable(Date date, String message) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate();
    List args = new ArrayList();
    String query = "INSERT INTO NEW_ENTRY VALUES ('1',?,?)";
    jdbcTemplate = new JdbcTemplate(dataSource);
    args.add(date);
    args.add(message);
    jdbcTemplate.update(query,args);
    return null;
}

堆栈跟踪:

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/app] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Property 'dataSource' is required] with root cause
java.lang.IllegalArgumentException: Property 'dataSource' is required
    at org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSet(JdbcAccessor.java:135)
    at org.springframework.jdbc.core.JdbcTemplate.<init>(JdbcTemplate.java:168)
    at com.easyFinder.app.ServiceDAOImpl.SearchResultsServiceDAOImpl.enterIntoNewEntrytable(SearchResultsServiceDAOImpl.java:28)
    at com.easyFinder.app.SearchActionController.home(SearchActionController.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

请帮我找到解决办法。

【问题讨论】:

    标签: spring spring-mvc datasource spring-jdbc jdbctemplate


    【解决方案1】:

    你需要

    <beans:bean id="searchResultsServiceDAO"  class="com.easyFinder.app.ServiceDAOImpl.SearchResultsServiceDAOImpl">
        <beans:property name="dataSource"  ref="dataSource" />    
    </beans:bean>
    

    界面

    public interface SearchresultsServiceDAO {
       public String enterIntoNewEntrytable(Date date, String message);
    }
    

    然后

    public class SearchresultsServiceDAOImpl 
        implements SearchresultsServiceDAO {
    
        private DataSource dataSource;
    
        public void setDataSource(DataSource dataSource) {
            this.dataSource = dataSource;
        }
    
        public String enterIntoNewEntrytable(Date date, String message) {
            //Then you can use
            Connection conn = dataSource.getConnection();
            // ...
            return null;
        }
    
    }
    

    如果你想将数据源注入JdbcTemplate 使用

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

    并以这种方式使用它

    @Autowired 
    JdbcTemplate jdbcTemplate;
    

    您可能还需要&lt;context:annotation-config/&gt;,具体取决于您的配置

    【讨论】:

      【解决方案2】:

      您需要在配置中使用interface 定义而不是implementation

      你目前已经定义了哪个是指实现,

      <beans:bean id="SearchResultsServiceDAOImpl"  class="com.easyFinder.app.ServiceDAOImpl.SearchResultsServiceDAOImpl">
                <beans:property name="dataSource"  ref="dataSource" />    
      </beans:bean>
      

      改为更新它(请验证路径),

      <beans:bean id="searchResultsServiceDAO"  class="com.easyFinder.app.ServiceDAO.SearchResultsServiceDAO">
          <beans:property name="dataSource" ref="dataSource" />    
      </beans:bean>
      

      我看到你使用了constructor 注入。但是您可以对 inject bean 使用基于注释的实现方法,因为这将消除在每个 DAO 构造函数中传递 dataSource 的要求。

      检查@Autowired 文档。

      @Autowired
      DataSource dataSource;
      

      【讨论】:

        【解决方案3】:

        确保 DataSource 和 JdbcTemplate 已初始化,并且 getJdbcTemplate 在数据流中定义(在任何地方,但应该这样做)。下面是一个例子:

        @Autowired
        protected DataSource dataSource;
        
        /** Spring JDBC helper. */
        public JdbcTemplate jdbcTemplate;
        
        /**
         * Gets the jdbc template. Instantiates on first call.
         * 
         * @return the jdbc template
         */
        public JdbcTemplate getJdbcTemplate() {
            if (null == jdbcTemplate) {
                jdbcTemplate = new JdbcTemplate(dataSource);
            }
            return jdbcTemplate;
        }
        

        当我直接调用 impl 类时,我得到了同样的异常,但是这些是在基类中启动的。

        【讨论】:

          猜你喜欢
          • 2017-01-11
          • 2018-01-25
          • 1970-01-01
          • 1970-01-01
          • 2022-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多