2016-03-17 44 views
7

我正在嘗試編寫註釋配置的spring應用程序。我已經定義了一個dataSource和jdbcTemplate,並且我確定Spring會初始化它們(當評論它們時,我有一個異常告訴我這個bean沒有初始化)。我不知道爲什麼當bean初始化時我有這個異常。我將複製xml,dao類和stacktrace。Spring Framework IllegalArgumentException'dataSource'或'jdbcTemplate'是必需的JAVA

XML

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    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"> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="jdbc:postgresql://localhost:5432/test" /> 
     <property name="username" value="root" /> 
     <property name="password" value="root" /> 
    </bean> 

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <constructor-arg> 
      <ref bean="dataSource" /> 
     </constructor-arg> 
    </bean> 

</beans> 

DAO

@Repository 
public class DomainsDao extends JdbcDaoSupport { 

    @Autowired 
    private MessageSourceAccessor msa; 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    public List<Domain> getInactiveDomains() { 
     return jdbcTemplate.query(msa.getMessage("sql.pass.domain.select_inactive"), new DomainRowMapper()); 
    } 
public int getDomainId(String name) { 
     String sql = msa.getMessage("sql.pass.domain.select_by_name"); 
     Object[] args = new Object[] { name }; 
     return jdbcTemplate.queryForObject(sql, args, Integer.class); 
    } 
} 

棧跟蹤

java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 
    org.springframework.jdbc.core.support.JdbcDaoSupport.checkDaoConfig(JdbcDaoSupport.java:111) 
    org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1631) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1120) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1044) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1208) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1120) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1044) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1208) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

EDI牛逼我會添加我的所有配置的

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 
    <description> 
    SaaS Admin 
    </description> 

    <display-name>SaaS Admin</display-name> 

    <!-- <error-page> <error-code>404</error-code> <location>/error404.jsp</location> 
     </error-page> --> 

    <servlet> 
     <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
       /WEB-INF/conf/app-config.xml 
      </param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

APP-config.xml中

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

    <!-- Scanning package with configuration files --> 

    <context:component-scan base-package="bg.abv.saas.admin.config" /> 

    <!-- Application Message Bundle --> 

    <bean id="messageSource" 
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="basenames"> 
      <list> 
       <value>WEB-INF/props/configure</value> 
       <value>WEB-INF/props/sql</value> 
       <value>WEB-INF/props/strings</value> 
       <value>WEB-INF/props/log4j</value> 
      </list> 
     </property> 
     <property name="defaultEncoding" value="UTF-8" /> 
     <property name="cacheSeconds" value="60" /> 
    </bean> 

    <bean id="msa" 
     class="org.springframework.context.support.MessageSourceAccessor"> 
     <constructor-arg> 
      <ref bean="messageSource" /> 
     </constructor-arg> 
    </bean> 

WebServletApplicationInitializer

@EnableWebMvc 
@Configuration 
@ComponentScan("bg.abv") 
@ImportResource(value = { "/WEB-INF/conf/data-source.xml" }) 
public class WebServletApplicationInitializer extends WebMvcConfigurerAdapter { 

    @Bean 
    public InternalResourceViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("/WEB-INF/views/jsp/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/*"); 
    } 

data-source.xml此文件的內容是具有dataSource和jdbcTemplate bean的xml文件。

+0

你有什麼設置加載您的application.xml? (在web.xml中)。你說你的應用程序是基於註釋的,那麼Spring應該如何知道從任何.xml文件中初始化任何東西呢? –

+0

@Martin Hansen我編輯了我的問題。 – RockOrDead

回答

2

我想你應該放棄的JdbcTemplate的自動裝配在DomainsDao並注入您的數據源來代替。然後通過調用org.springframework.jdbc.core.support.JdbcDaoSupport#getJdbcTemplate方法來獲取jdbcTemplate。

例如:

@Repository 
public class DomainsDao extends JdbcDaoSupport { 

    @Autowired 
    private MessageSourceAccessor msa; 

    @Autowired 
    public void setDs(DataSource dataSource) { 
     setDataSource(dataSource); 
    } 

    public List<Domain> getInactiveDomains() { 
     return getJdbcTemplate().query(msa.getMessage("sql.pass.domain.select_inactive"), new DomainRowMapper()); 
    } 
    public int getDomainId(String name) { 
     String sql = msa.getMessage("sql.pass.domain.select_by_name"); 
     Object[] args = new Object[] { name }; 
     return getJdbcTemplate().queryForObject(sql, args, Integer.class); 
    } 
} 

如果你仍然要注入自己的jdbcTemplate需要一個類似的方法:

@Repository 
public class DomainsDao extends JdbcDaoSupport { 

    @Autowired 
    private MessageSourceAccessor msa; 

    @Autowired 
    public void setJT(JdbcTemplate jdbcTemplate) { 
     setJdbcTemplate(jdbcTemplate); 
    } 

    public List<Domain> getInactiveDomains() { 
     return getJdbcTemplate().query(msa.getMessage("sql.pass.domain.select_inactive"), new DomainRowMapper()); 
    } 
    public int getDomainId(String name) { 
     String sql = msa.getMessage("sql.pass.domain.select_by_name"); 
     Object[] args = new Object[] { name }; 
     return getJdbcTemplate().queryForObject(sql, args, Integer.class); 
    } 
} 
+0

這個工程,但現在我有這個例外:java.lang.NoSuchMethodError:org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(Ljava/lang/reflect/AnnotatedElement; Ljava/lang/Class;)Ljava/lang/annotation/Annotation ; – RockOrDead

0

能否請您試試這個,

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

也有例外。 – RockOrDead

+0

@RockOrDead: \t 是否添加了這個? – Lathy

+0

我編輯了我的問題。 – RockOrDead

0

的問題是,你是從已經繼承了JdbcDaoSupport類有一個您需要設置jdbcTemplate屬性。 JdbcDaoSupport檢查您是否在其afterPropertiesSet方法中提供了jdbcTemplate或dataSource屬性。但是,您聲明並注入了自己的jdbcTemplate,意思是DomainsDao具有兩個jdbcTemplate屬性(您聲明的屬性和一個繼承自JdbcDaoSupport的屬性)

您可以通過從calss聲明中除去擴展的JdbcDaoSupport部分來解決此問題。

或者,如果你真的想繼承另一個從JdbcDaoSupport然後改變你的類如下

@Repository 
public class DomainsDao extends JdbcDaoSupport { 

    @Autowired 
    private MessageSourceAccessor msa; 

    @Autowired 
    public DomainsDao (JdbcTemplate jdbcTemplate){ 
     setJdbcTemplate(jdbcTemplate); 
    } 

    public List<Domain> getInactiveDomains() { 
     return getJdbcTemplate().query(msa.getMessage("sql.pass.domain.select_inactive"), new DomainRowMapper()); 
    } 
public int getDomainId(String name) { 
     String sql = msa.getMessage("sql.pass.domain.select_by_name"); 
     Object[] args = new Object[] { name }; 
     return getJdbcTemplate.queryForObject(sql, args, Integer.class); 
    } 
} 
+0

這有效,但現在我有這個例外:java.lang.NoSuchMethodError:org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(Ljava/lang/reflect/AnnotatedElement; Ljava/lang/Class;)Ljava/lang/annotation/Annotation ; – RockOrDead

相關問題