java - poner - No se puede aplicar DaoAuthenticationConfigurer al objeto ya construido
jtextarea ejemplos (1)
Me sale esta excepción:
[WARN] org.springframework.web.context.support.GenericWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''accountResource'': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private io.ilopezluna.japanathome.service.UserService io.ilopezluna.japanathome.web.rest.AccountResource.userService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''userService'': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.security.crypto.password.PasswordEncoder io.ilopezluna.japanathome.service.UserService.passwordEncoder; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''securityConfiguration'': Injection of autowired dependencies failed; nested exception is java.lang.IllegalStateException: Cannot apply org.springframework.security.config.annotation.authentication.configurers.userdetails.DaoAuthenticationConfigurer@54aa5730 to already built object
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:293) ~[spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1186) ~[spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE]
Puedes ver más en https://travis-ci.org/ilopezluna/japan-at-home/builds/37866955
Esta excepción se produce durante la ejecución de las pruebas. Pero no puedo reproducirlo en mi servidor local, siempre obtengo un éxito de construcción: S
Me tomó dos días, pero creo que finalmente he resuelto esto. En mi clase SecurityConfiguration
, tenía el siguiente método:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(jsr250Enabled=true, prePostEnabled=true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(authenticationService);
}
}
Reemplacé el método configureGlobal
con un método de configure
:
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(authenticationService);
}
Y ahora todo funciona bien.
De acuerdo con esta respuesta, la diferencia es que el uso de configureGlobal
permitirá AuthenticationManager
por seguridad de método global u otro HttpSecurity (WebSecurityConfigurerAdapter).
Como puede ver arriba, estoy habilitando tanto la seguridad de Web Mvc como la seguridad de los métodos globales. De acuerdo con mis pruebas unitarias, ambos continúan trabajando con este cambio, pero hay algo de debate aquí en mi oficina sobre si este cambio es correcto (es decir, si se está configurando la seguridad del método global correctamente), o si hay otro problema con esto solución.
Creemos que la causa raíz del problema es algún tipo de error de Spring, posiblemente una condición de carrera. Por improbable que parezca, el problema solo se manifestó cuando agregamos una clase vacía al proyecto, no importaba cuál era el paquete o el nombre de la clase.