2016-01-09 1 views
0

Je suis la mise en œuvre Se souvenir de moi au printemps security.And voici ma configurationsécurité Spring: ne peut pas résoudre la référence à grains lors de la définition argument du constructeur

<bean id="rememberMeServices" 
      class="com.spring.security.service.WMPersistentTokenBasedRememberMeServices"> 
     <constructor-arg name="userDetailsService" ref="loginService"/> 
     <property name="tokenValiditySeconds" value="300"></property> 
</bean> 


<security:http auto-config="false" use-expressions="true" entry-point-ref="appAuthenticationEntryPoint"> 
     <!-- Interceptor urls --> 
     <security:remember-me user-service-ref="#{rememberMeServices.getUserDetailsServiceInstance()}" token-repository-ref="#{rememberMeServices.getTokenRepository()}" /> 
</security:http> 

Et mes WMPersistentTokenBasedRememberMeServices ressemble

public class WMPersistentTokenBasedRememberMeServices extends PersistentTokenBasedRememberMeServices { 

    private static final String key = "WM_APP_KEY"; 

    private static final PersistentTokenRepository tokenRepository = new InMemoryTokenRepositoryImpl(); 

    public WMPersistentTokenBasedRememberMeServices(UserDetailsService userDetailsService) { 
     super(key, userDetailsService, tokenRepository); 
    } 

    public PersistentTokenRepository getTokenRepository() { 
     return tokenRepository; 
    } 

    public UserDetailsService getUserDetailsServiceInstance() 
    { 
     return getUserDetailsService(); 
    } 
} 

Mais quand Je déploie l'application avec la configuration ci-dessus, je suis getter ci-dessous l'erreur

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#61fc8560': Cannot resolve reference to bean 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0' while setting bean property 'logoutHandlers' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0': Cannot resolve reference to bean '#{rememberMeServices.getTokenRepository()}' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinition 
Exception: No bean named 'org.springframework.sec[email protected]2a13c5e' is defined 


Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#0': Cannot resolve reference to bean '#{rememberMeServices.getTokenRepository()}' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.sec[email protected]2a13c5e' is defined 

Lorsque je supprimer en utilisant le langage d'expression de printemps dans

<security:remember-me ...> 
tag

et de fournir par exemple ref utilisateur valide, il fonctionne très bien.

Mais quand j'utilise le langage d'expression de ressort il échoue avec l'erreur ci-dessus. Je doute avec l'ordre de la création de bean.

Quelqu'un ayant une idée à propos de cette erreur?

Répondre

2

Le message d'erreur dit tout:

Exception: No bean named 'org.springframework.sec[email protected]2a13c5e' is defined 

Le dépôt jeton n'est pas un haricot. En effet, si vous regardez votre code, le TokenRepository est un champ statique. Au lieu d'utiliser un champ statique, déclarer comme un haricot: dans votre config xml, ajouter quelque chose comme:

<bean id="tokenRepository" 
     class="org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl"/> 

et remplacer le champ statique avec quelque chose comme:

@Autowired 
private PersistentTokenRepository tokenRepository; 

printemps, en tant que dépendance cadre d'injection, fournit des mécanismes utiles pour éviter l'utilisation de la référence statique: il suffit d'utiliser ces mécanismes.

+0

Même après avoir effectué les modifications que vous avez suggérées, l'erreur est toujours présente. Impossible de résoudre la référence à bean '# {rememberMeServices.getTokenRepository()}' lors de la définition de l'argument constructeur; l'exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean nommé 'org.springframework.sec[email protected]4d19bf23'. Les haricots sont en train de créer et autowiring fine.My seule préoccupation est le langage d'expression ne résout pas dans la balise de sécurité de printemps. –