2016-03-17 6 views
7

मैं स्प्रिंग एप्लिकेशन लिखने की कोशिश कर रहा हूं जो एनोटेशन कॉन्फ़िगर किया गया है। मैंने डेटासोर्स और जेडीबीसी टेम्पलेट को परिभाषित किया है और मुझे यकीन है कि वसंत उन्हें शुरू करता है (जब उन्हें टिप्पणी की गई तो मुझे एक अपवाद है जो मुझे बताता है कि यह सेम शुरू नहीं किए गए हैं)। मुझे नहीं पता कि बीन्स शुरू होने पर मुझे यह अपवाद क्यों है। मैं एक्सएमएल, दाओ वर्ग और स्टैकट्र्रेस की प्रतिलिपि बनाउंगा।स्प्रिंग फ्रेमवर्क अवैध अर्ग्यूमेंट एक्सेप्शन 'डेटासोर्स' या 'जेडीबीसी टेम्पलेट' की आवश्यकता है जावा

एक्सएमएल

<?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> 

दाव

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

ईडीआई टी मैं अपने विन्यास के सभी जोड़ देगा

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> 

एप्लिकेशन-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/*"); 
    } 

डेटा-स्रोत.एक्सएमएल इस फ़ाइल की सामग्री डेटा स्रोत और जेडीबीसी टेम्पलेट बीन्स के साथ एक्सएमएल फ़ाइल है।

+0

आप अपने application.xml लोड करने के लिए सेटअप कुछ भी है JdbcDaoSupport फिर अपने वर्ग बदलने से करना चाहते हैं? (fx। web.xml में)। आप कहते हैं कि आपका एप्लिकेशन एनोटेशन आधारित है, फिर वसंत को किसी भी .xml फ़ाइल से कुछ भी शुरू करने के बारे में पता होना चाहिए? –

+0

@ मार्टिन हैंनसेन मैंने अपना प्रश्न संपादित किया। – RockOrDead

उत्तर

2

मुझे लगता है कि आप अपने DomainsDao में jdbcTemplate की autowiring ड्रॉप और इसके बजाय अपने डेटा स्रोत इंजेक्षन चाहिए। फिर org.springframework.jdbc.core.support.JdbcDaoSupport#getJdbcTemplate विधि को कॉल करके jdbc टेम्पलेट प्राप्त करें।

उदाहरण:

@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 <संदर्भ: घटक-स्कैन बेस-पैकेज = "com.test। *" /> क्या आपने इसे जोड़ा? – Lathy

+0

मैंने अपना प्रश्न संपादित किया। – RockOrDead

0

समस्या है JdbcDaoSupport वर्ग है कि आप पहले से इनहेरिट हैं कि jdbc टेम्पलेट संपत्ति जिसे आपको सेट करने की आवश्यकता है। JdbcDaoSupport जांच करता है कि आपने या तो jpbc टेम्पलेट या डेटा स्रोत प्रॉपर्टी को इसके बाद के प्रॉपर्टीजसेट विधि में प्रदान किया है या नहीं। लेकिन अगर आप की घोषणा कर रहे हैं और इंजेक्शन लगाने के अपने खुद के jdbcTemplate अर्थ DomainsDao दो jdbcTemplate गुण (एक आप यह घोषणा के अलावा एक JdbcDaoSupport से विरासत में मिली)

आप को निकालते समय अपने calss घोषणा से 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

संबंधित मुद्दे