2014-09-19 72 views
0

我想运行spring + JDBC + Webservice程序。 运行时出现异常this.org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'leadDAO'的beanorg.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'leadDAO'的bean

请帮忙。我被卡住了。谢谢

的web.xml

<!-- Processes application requests --> 
    <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>/lms/*</url-pattern> 
    </servlet-mapping> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring-servlet.xml, /WEB-INF/applicationContext.xml</param-value> 
</context-param> 


<!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

</web-app> 

现在我为spring-servlet.xml

 <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/jsp/"/> 
      <property name="suffix" value=".jsp"/> 
     </bean> 


    <!-- declare datasource bean --> 
     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
      <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
      <property name="url" value="jdbc:mysql://localhost:3307/lms" /> 
      <property name="username" value="root" /> 
      <property name="password" value="" /> 
    </bean> 


    <!-- declare beans --> 
     <bean id="leadDAO" class="com.varazo.dao.LeadDAOImpl"> 
     <!-- <property name="dataSource" ref="dataSource"></property> --> 
    </bean> 

     <bean id="newLeadService" class="com.varazo.service.NewLeadService"/> 

</beans> 

的applicationContext.xml

<import resource="classpath*:spring-servlet.xml"/> 
<!-- Activates various annotations to be detected in bean classes --> 
<context:annotation-config /> 


     <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans. 
    For example @Controller and @Service. Make sure to set the correct base-package--> 
<context:component-scan base-package="com.varazo.dao" /> 
<context:component-scan base-package="com.varazo.service" /> 
<context:component-scan base-package="com.varazo.app" /> 
<context:component-scan base-package="com.varazo.pojo" /> 

<!-- Configures the annotation-driven Spring MVC Controller programming model. 
Note that, with Spring 3.0, this tag works in Servlet MVC only! --> 
<mvc:annotation-driven /> 

</beans> 

和bean类:

package com.varazo.pojo; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="newlead") 
public class NewLead { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private Double money; 

    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    public Double getMoney() { 
     return money; 
    } 
    public void setMoney(Double money) { 
     this.money = money; 
    } 
} 

我的服务类

package com.varazo.service; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.stereotype.Service; 

import com.varazo.dao.LeadDAOImpl; 
import com.varazo.pojo.NewLead; 


@Service("newLeadService") 
public class NewLeadService { 

/** 
* Retrieves all persons 
*/ 
public List<NewLead> getAll() { 

    // logger.debug("Retrieving all persons"); 
    System.out.println("Retrieving all persons 1"); 
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring-servlet.xml"); 
    System.out.println("Retrieving all persons 2"); 
      LeadDAOImpl leadDAOImplObj = (LeadDAOImpl) context.getBean("leadDAO"); 
      List<NewLead> lList = new ArrayList<NewLead>(); 
      lList = leadDAOImplObj.listNewLeads(); 
     System.out.println("Retrieving all persons "+lList); 

return lList; 
} 

} 

我daoImpl

package com.varazo.dao; 

import java.util.List; 

import javax.sql.DataSource; 

import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.stereotype.Repository; 

import com.varazo.pojo.NewLead; 
@Repository 
public class LeadDAOImpl implements LeadDAO { 
     private DataSource dataSource; 
     private JdbcTemplate jdbcTemplate; 

     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 
      this.jdbcTemplate = jdbcTemplate; 
     } 


    public List<NewLead> listNewLeads() { 

      JdbcTemplate select = new JdbcTemplate(dataSource); 
      return select.query("select ID from llead LIMIT 2", new LeadRowMapper()); 
     } 


    } 

我控制器

package com.varazo.app; 

import javax.annotation.Resource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 

import com.varazo.pojo.NewLead; 
import com.varazo.pojo.NewLeadList; 

@Controller 
@RequestMapping("/lead") 
public class LeadController { 


    @Resource(name="newLeadService") 
    private com.varazo.service.NewLeadService newLeadService; 

    @RequestMapping(value = "/newLeads", method = RequestMethod.GET, headers="Accept=application/xml, application/json") 
     public @ResponseBody com.varazo.pojo.NewLeadList getNewLead() { 

      // Call service here 
     NewLeadList result = new NewLeadList(); 
      result.setData(newLeadService.getAll()); 
      System.out.println("*********************LeadController Retrieving all persons ***"+result+"****************"); 
      return result; 
     } 

} 

URL:

/LMS-移动/ LMS /铅/ newLeads

+1

很高兴您发布了大量信息,但这太多了。您能否将您的代码缩减到对理解/再现问题至关重要的部分?谢谢! – lxg 2014-09-19 15:01:35

回答

2

其中:

为什么要声明这个bean两次?

<bean id="leadDAO" class="com.varazo.dao.LeadDAOImpl"> 
    <!-- <property name="dataSource" ref="dataSource"></property> --> 
</bean> 

@Repository 
public class LeadDAOImpl implements LeadDAO { 

二:

你将如何注入这些依赖:

@Repository 
public class LeadDAOImpl implements LeadDAO { 
     private DataSource dataSource; 
     private JdbcTemplate jdbcTemplate; 

三:

为什么从@Service以下

你可以从

<context:component-scan base-package="com.varazo.dao" /> 
<context:component-scan base-package="com.varazo.service" /> 
<context:component-scan base-package="com.varazo.app" /> 
<context:component-scan base-package="com.varazo.pojo" /> 

要改变(没有十分的把握,但你可以只有一个声明)

<context:component-scan base-package="com.varazo.dao,com.varazo.service,com.varazo.app, com.varazo.pojo" /> 

四类?

ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring-servlet.xml"); 

确实是一个坏实践做到这一点,一个@Service绝不能有大约网络层的知识。

我建议改变

@Service("newLeadService") 
public class NewLeadService { 

private LeadDAO leadDAOImplObj; 

@Autowired 
public NewLeadService(LeadDAO leadDAOImplObj){ 
    this.leadDAOImplObj = leadDAOImplObj; 
} 

public List<NewLead> getAll() { 

    // logger.debug("Retrieving all persons"); 
    System.out.println("Retrieving all persons 1"); 
    System.out.println("Retrieving all persons 2"); 
    List<NewLead> lList = new ArrayList<NewLead>(); 
    lList = leadDAOImplObj.listNewLeads(); 
    System.out.println("Retrieving all persons "+lList); 

    return lList; 
} 

五:

阅读DI的所有参考文档,你正在做的事情真的错了。您必须在基于接口的Java类中声明您的依赖项,而不是通过具体的类声明。您的@Service类不会实现一个接口。

+0

谢谢。你已经睁开眼睛。更少的时间,即时的需求和持续的压力只会导致不好的应用。 – Pan 2014-10-07 10:36:54

相关问题