2011-01-26 12 views
6

próbuje zintegrować hibernacji i sprężynę, wpadłem na tego błęduwiosna BeanCreationException zamieszanie o mapowanie

ciężkie: inicjalizacji kontekst nieudanej org.springframework.beans.factory.BeanCreationException: Błąd podczas tworzenia Bean z nazwą „org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping”: Zainicjowanie nie powiodło fasoli; wyjątek zagnieżdżonych jest java.lang.IllegalStateException: nie można mapować obsługi „org.me.spring.hib.school.web.SchoolController#0” do ścieżki URL [/allschools]: Nie ma już obsługi typu [klasa org.me.spring.hib.school.web.SchoolController] odwzorowane.

moim kontroler wygląda

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

} 

Mam wstrzykiwany realizację dao w APP pliku kontekstowego

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

Nie mogę zrozumieć, dlaczego SchoolController#0 jest odwzorowany na adres URL.

Odpowiedz

22

Dzieje się tak dlatego, że masz zarówno

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

i

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

Pierwsza linia będzie automatycznie wykryć i zarejestrować SchoolController dla Ciebie. Wyraźnie deklarując inną, otrzymasz duplikat, a mapowanie adresów URL będzie się kolidować.

Trzeba albo usunąć <context:component-scan> lub usunąć wyraźne definicje fasoli dla kontrolera i DAO. Jeśli zrobisz to drugie, będziesz musiał użyć autowiring do wstrzyknięcia ich zależności.

+0

dzięki skaffman .. – markjason72

0

I w obliczu podobnego rodzaju problemu. Zdefiniowałem klasę kontrolera z "@Controller", a także w pliku Spring-config.xml jako komponent bean i wstrzyknięto zależności.

To było przyczyną problemu. @Controller definiuje komponent bean i ponownie komponent bean zdefiniowany w pliku xml redefiniuje zależności. Próbowałem wyposażyć zależności i usunąć ją jako fasoli z pliku xml. Potem zadziałało.

0

Można też wspomnieć <mvc:annotation-driven/> w swoim XML i usunąć

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

Jeśli są wygodne z notacji XML.