2011-01-26 10 views
6

tratando de integrar hibernación y la primavera, me encontré con este errorprimavera BeanCreationException confusión acerca de la asignación

GRAVES: Contexto de inicialización falló org.springframework.beans.factory.BeanCreationException: Error al crear el frijol con el nombre 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping': inicialización de frijol fracasó; la excepción anidada es java.lang.IllegalStateException: No se puede asignar el manejador 'org.me.spring.hib.school.web.SchoolController#0' a la ruta URL [/allschools]: Ya hay un manejador de tipo [clase org.me.spring.hib.school.web.SchoolController] asignado.

Mi controlador parece

package org.me.spring.hib.school.web; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.me.spring.hib.school.dao.SchoolDAO; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
public class SchoolController { 
    private SchoolDAO schoolDao; 

    public SchoolDAO getSchoolDao() { 
     return schoolDao; 
    } 

    public void setSchoolDao(SchoolDAO schoolDao) { 
     this.schoolDao = schoolDao; 
    } 
     @RequestMapping("/allschools") 
    public ModelAndView showAllSchools(HttpServletRequest request,HttpServletResponse response) throws Exception{ 
     if(this.schoolDao ==null){ 
      System.out.println("this.schoolDao is null"); 
     } 
     ModelMap modelMap = new ModelMap(); 
     modelMap.addAttribute("schoolsList", this.schoolDao.getAllSchools()); 
     return new ModelAndView("allschools", modelMap); 
    } 

} 

he inyectado a la aplicación DAO en aplicación archivo de contexto

<context:component-scan base-package="org.me.spring.hib.school.web" /> 

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
     <property name="sessionFactory" > 
      <ref bean="sessionFactory" /> 
     </property>  
    </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource"> 
      <ref local="dataSource"/> 
     </property> 
     <property name="annotatedClasses"> 
      <list> 
       <value>org.me.spring.hib.school.domain.School</value> 
       <value>org.me.spring.hib.school.domain.Teacher</value> 
       <value>org.me.spring.hib.school.domain.Student</value> 
      </list> 
     </property> 


     <property name="hibernateProperties"> 
     <props> 
       <prop key="hibernate.dialect"> org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
     </property> 

    </bean> 

    <bean id="schoolDao" class="org.me.spring.hib.school.dao.SchoolDAOImpl"> 
     <property name="hibernateTemplate" ref="hibernateTemplate" /> 
    </bean> 


    <bean class="org.me.spring.hib.school.web.SchoolController" > 
      <property name="schoolDao" ref="schoolDao" /> 
    </bean> 

no puedo distinguir qué SchoolController#0 se está asignando a la URL.

Respuesta

22

Esto está ocurriendo porque tiene tanto

<context:component-scan base-package="org.me.spring.hib.school.web" /> 

y

<bean class="org.me.spring.hib.school.web.SchoolController" > 

La primera línea de auto-descubrirá y registrar una SchoolController para usted. Al declarar explícitamente otro, obtienes un duplicado y el mapeo de URL chocará.

Debe eliminar el <context:component-scan>, o eliminar las definiciones de bean explícitas para el controlador y el DAO. Si haces esto último, entonces necesitarás usar el autoenvío para inyectar sus dependencias.

+0

gracias skaffman .. – markjason72

0

Me enfrenté a un tipo similar de problema. He definido la clase de controlador con "@Controller" y también en el archivo Spring-config.xml como un bean y he inyectado las dependencias.

Esto estaba provocando el problema. @Controller está definiendo el bean y nuevamente, el bean definido en el archivo xml está redefiniendo las dependencias. Intenté autocablear la dependencia y la eliminé como un bean del archivo xml. Luego funcionó.

0

O puede mencionar <mvc:annotation-driven/> en su XML y quitar la parte

<context:component-scan base-package="org.me.spring.hib.school.web" />.

Si se siente cómodo con las notaciones XML.

Cuestiones relacionadas