2012-09-08 21 views
5

Otrzymuję wyjątek z komunikatem: "org.springframework.beans.factory.NoSuchBeanDefinitionException: Nie zdefiniowano komponentu bean o nazwie" userDetailsService ", mimo że komponent bean jest zdefiniowany jako usługa w klasie UserDetailsServiceImpl. Takich jak:Pomoc w konfiguracji zabezpieczeń Spring and Spring, nie można znaleźć komponentu bean.

@Service(value="userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService{ 

używam najnowszego sprężyna i Zabezpieczenia.

Nie jestem pewien, co robię źle. Wklejam konfigurację moich wiosennych plików xml. Plik spring-security.xml pokazuje, że może znaleźć komponenty bean z pliku servlet-context.xml podczas korzystania ze skanowania komponentu.

Dziękuję

org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.security.filterChains': Cannot resolve reference to bean org.springframework.security.web.DefaultSecurityFilterChain#0' while setting bean property sourceList' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.security.web.DefaultSecurityFilterChain#0': Cannot resolve reference to bean org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' while setting constructor argument with key [2]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0': Cannot resolve reference to bean org.springframework.security.authentication.ProviderManager#0' while setting bean property authenticationManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.security.authentication.ProviderManager#0': Cannot resolve reference to bean 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.security.authenticationManager': Cannot resolve reference to bean org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' while setting constructor argument with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.security.authentication.dao.DaoAuthenticationProvider#0': Cannot resolve reference to bean 'userDetailsService' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userDetailsService' is defined 

wiosna-security.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 


<beans:import resource="classpath*:servlet-context.xml"/> 

<global-method-security secured-annotations="enabled"></global-method-security>  

<http auto-config="true" > 
    <!-- Filtering url patterns --> 

    <!-- Anonymous users --> 
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 

    <!-- Login and logout controls --> 
    <form-login login-page="/login" default-target-url="/profile" 
     authentication-failure-url="/loginfailed" /> 
    <logout invalidate-session="true" logout-success-url="/" 
     delete-cookies="JSESSIONID" /> 

</http> 

<beans:bean id="authenticationProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <beans:property name="userDetailsService" ref="userDetailsService"/> 
</beans:bean> 



<beans:bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <beans:property name="providers"> 
     <beans:list> 
      <beans:ref local="authenticationProvider" /> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

<authentication-manager> 
    <authentication-provider user-service-ref="userDetailsService"> 
    </authentication-provider> 
</authentication-manager>  

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" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    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"> 


<annotation-driven /> 

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

               <!-- Data source configuration --> 

<!-- JDBC configuration for ORM --> 
<beans:bean id="dbDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <beans:property name="url" value="jdbc:mysql://localhost:3306/dbName"/> 
    <beans:property name="username" value="root"/> 
    <beans:property name="password" value=""/> 
</beans:bean> 

<!-- Hibernate session Factory --> 
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <beans:property name="dataSource" ref="dbDataSource" /> 

    <!-- All the model packages with hibernate annotations that need to be scanned. --> 
    <beans:property name="packagesToScan"> 
     <beans:value> 
      com.package.registration.models 
     </beans:value> 
    </beans:property> 

    <!-- Hibernate specific properties --> 
    <beans:property name="hibernateProperties"> 
     <beans:props> 
      <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</beans:prop> 
      <beans:prop key="hibernate.show_sql">true</beans:prop> 
      <beans:prop key="hibernate.format_sql">true</beans:prop> 
      <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop> 
      <beans:prop key="org.hibernate.transaction">true</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 

<!-- A transaction manager for working with Hibernate SessionFactories --> 
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <beans:property name="sessionFactory" ref="sessionFactory"/> 
</beans:bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

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

+0

Może chcieć sformatować ten wyjątek, abyśmy nie musieli tak bardzo przewijać w prawo. –

Odpowiedz

7

Musisz umieścić skan składnika w twoim innym pliku konfiguracji Spring, a nie tylko konfigurację serwletu.

Są to różne konteksty, jeden ładowany przez moduł nasłuchujący modułu kontekstowego, jeden przez serwlet wysyłający.

+0

Dzięki, właśnie zdałem sobie sprawę, że servlet-context.xml jest specyficzny dla DispatcherServlet. Usunąłem więc całą konfigurację i wstawiłem do nowego pliku spring.xml. Dodałem to do contextConfigLocation w web.xml. Teraz działa! – user724535

3

Upewnij się dodać

<context:annotation-config /> 
<context:component-scan base-package="<your package name" /> 

do ciebie kontekstu aplikacji, inaczej wiosną nie będzie wiedział, gdzie szukać ziaren deklarowanych z adnotacjami. Uwaga, Spring przeskanuje określony pakiet i wszystkie podpakiety.

Powiązane problemy