1

Hi I am new to Spring: I have a problem related with the configuration of my project;

this is my servlet-context.xml:

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

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->

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

    <context:component-scan base-package="com.metmi.mmasgis" />

    <beans:bean id="DbImpl" class="com.metmi.mmasgis.dao.DbImpl">
        <beans:property name="dataSource" ref="dataSource" />

    </beans:bean>



    <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <beans:property name="driverClassName"
            value="com.mysql.jdbc.Driver">
        </beans:property>
        <beans:property name="username" value="root"></beans:property>
        <beans:property name="password" value="vilu7240"></beans:property>
        <beans:property name="url"
            value="jdbc:mysql://localhost:3306/springschema">
        </beans:property>
    </beans:bean>
</beans:beans>

this is my controller:

    package com.metmi.mmasgis;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.metmi.mmasgis.dao.DbImpl;
import com.metmi.mmasgis.model.Db;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
    @Autowired
    DbImpl dbs;
    private static final Logger logger = LoggerFactory
            .getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
                DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute("serverTime", formattedDate);

        return "home";
    }

    /**
     * get the database list in Mysql
     */
    @RequestMapping(value = "/db", method = RequestMethod.GET)
    public String dbs(Locale locale, Model model) {
        ArrayList<Db> dbList = dbs.getDatabases();
        model.addAttribute("dbList", dbList);
        return "dbs";
    }

    /**
     * Simply shows ciao.
     */
    @RequestMapping(value = "/ciao", method = RequestMethod.GET)
    public String ciao(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
                DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        model.addAttribute("serverTime", formattedDate);

        return "ciao";
    }

}

It is pretty basic, I get this error when I run it on the server:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.metmi.mmasgis.dao.DbImpl com.metmi.mmasgis.HomeController.dbs; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.metmi.mmasgis.dao.DbImpl] is defined: expected single matching bean but found 2: [dbImpl, DbImpl]
erhun
  • 3,549
  • 2
  • 35
  • 44
arpho
  • 1,576
  • 10
  • 37
  • 57

2 Answers2

4

In your servlet-context.xml you wrote:

<context:component-scan base-package="com.metmi.mmasgis" />

<beans:bean id="DbImpl" class="com.metmi.mmasgis.dao.DbImpl">
    <beans:property name="dataSource" ref="dataSource" />
</beans:bean>

It registers a Component with type of com.metmi.mmasgis.dao.DbImpl and name of DbImpl from XML configuration, and registers this exact same type, with name of dbImpl due to Component Scanning (autodetected components naming). Just omit the DbImpl bean definition in your config.xml.

Khosrow
  • 556
  • 1
  • 6
  • 16
1

Basic issue is there are two beans of same type defined in your spring bean pool. There are two ways to resolve this:

  1. As "Khosrow" said, remove DBImpl declaration from Spring config XML file.
  2. If you are using @Component annotation on your DBImpl class, then give a value to that annotation (like @Component("someOtherDbImpl")) and then in your autowiring put another annotation; like:


    @Autowired
    @Qualifier("someOtherDbImpl")
    DbImpl dbs;

Niranjan
  • 2,601
  • 8
  • 43
  • 54