2016-03-17 13 views
7

Tôi đang cố gắng viết ứng dụng mùa xuân được chú thích cấu hình. Tôi đã xác định một dataSource và jdbcTemplate và tôi chắc chắn rằng mùa xuân khởi tạo chúng (khi nhận xét chúng tôi có một ngoại lệ mà nói với tôi rằng đậu này không được khởi tạo). Tôi không có ý tưởng tại sao tôi có ngoại lệ này khi đậu được khởi tạo. Tôi sẽ sao chép xml, lớp dao và stacktrace.Spring Framework IllegalArgumentException 'dataSource' hoặc 'jdbcTemplate' là bắt buộc 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); 
    } 
} 

stack trace

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 T tôi sẽ thêm tất cả các cấu hình của tôi

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 nội dung của tệp này là tệp xml với hạt dataSource và jdbcTemplate.

+0

Các bạn đã cài đặt bất cứ điều gì để tải application.xml của bạn? (fx. trong web.xml). Bạn nói rằng ứng dụng của bạn là chú thích dựa trên, làm thế nào nên mùa xuân biết để khởi tạo bất cứ điều gì từ bất kỳ tập tin .xml sau đó? –

+0

@Martin Hansen i đã chỉnh sửa câu hỏi của tôi. – RockOrDead

Trả lời

2

Tôi nghĩ bạn nên thả autowiring của JdbcTemplate trong DomainsDao của bạn và tiêm dataSource của bạn để thay thế. Sau đó lấy jdbcTemplate bằng cách gọi phương thức org.springframework.jdbc.core.support.JdbcDaoSupport#getJdbcTemplate.

dụ:

@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); 
    } 
} 

Nếu bạn vẫn muốn tiêm riêng bạn jdbcTemplate phương pháp tương tự được yêu cầu:

@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

Điều này làm việc nhưng bây giờ tôi có ngoại lệ này: java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation (Ljava/lang/reflect/AnnotatedElement; Ljava/lang/Class;) Ljava/lang/chú thích/Chú thích ; – RockOrDead

0

bạn có thể vui lòng thử điều này,

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

cùng một ngoại lệ. – RockOrDead

+0

@RockOrDead: \t Bạn có thêm mục này không? – Lathy

+0

Tôi đã chỉnh sửa câu hỏi của mình. – RockOrDead

0

Vấn đề là rằng lớp JdbcDaoSupport mà bạn đang kế thừa từ đã có một jdbcTemplate tài sản mà bạn cần phải thiết lập. JdbcDaoSupport kiểm tra xem bạn đã cung cấp thuộc tính jdbcTemplate hoặc dataSource trong phương thức afterPropertiesSet của nó hay chưa. Tuy nhiên bạn đang khai báo và chèn jdbcTemplate của riêng bạn có nghĩa là DomainsDao có hai thuộc tính jdbcTemplate (một trong những bạn khai báo cộng với một thuộc tính được thừa kế từ JdbcDaoSupport)

Bạn có thể giải quyết điều này bằng cách loại bỏ phần mở rộng JdbcDaoSupport khỏi khai báo calss của bạn.

Ngoài ra nếu bạn thực sự muốn kế thừa từ JdbcDaoSupport sau đó thay đổi lớp học của bạn như sau

@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

Điều này hoạt động nhưng bây giờ tôi có ngoại lệ này: java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation (Ljava/lang/reflect/AnnotatedElement; Ljava/lang/Class;) Ljava/lang/chú thích/Chú thích ; – RockOrDead

Các vấn đề liên quan