Java 无法将spring.example.service.usuario服务字段spring.example.config.security.SecurityConfig.usuario设置为$Proxy47
运行web应用程序时,我面临以下错误:Java 无法将spring.example.service.usuario服务字段spring.example.config.security.SecurityConfig.usuario设置为$Proxy47,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,运行web应用程序时,我面临以下错误: SEVERE: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityConfig': Injection of autowired dependencies failed; nested exception is org.springframework.bea
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private spring.example.service.UsuarioService spring.example.config.security.SecurityConfig.usuario; nested exception is java.lang.IllegalArgumentException: Can not set spring.example.service.UsuarioService field spring.example.config.security.SecurityConfig.usuario to $Proxy47
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4959)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:634)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1074)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:554)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1649)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1447)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:679)
at org.apache.catalina.manager.ManagerServlet.doPut(ManagerServlet.java:437)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:611)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private spring.example.service.UsuarioService spring.example.config.security.SecurityConfig.usuario; nested exception is java.lang.IllegalArgumentException: Can not set spring.example.service.UsuarioService field spring.example.config.security.SecurityConfig.usuario to $Proxy47
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 57 more
Caused by: java.lang.IllegalArgumentException: Can not set spring.example.service.UsuarioService field spring.example.config.security.SecurityConfig.usuario to $Proxy47
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:680)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504)
... 59 more
我猜这与此配置类中的自动接线阿曲布他有关:
@Configuration
@ComponentScan(value="spring.example")
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UsuarioService usuario;
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(usuario)
.passwordEncoder(encoder());
}
private Md5PasswordEncoder encoder() {
return new Md5PasswordEncoder();
}
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/acesso/erro").permitAll()
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/acesso/login").permitAll()
.loginProcessingUrl("/login").permitAll()
.usernameParameter("login")
.passwordParameter("senha")
.defaultSuccessUrl("/acesso/start")
.failureUrl("/acesso/login")
.and()
.rememberMe()
.key("lembrete")
.useSecureCookie(true)
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/acesso/login").permitAll();
}
}
我的类UsuarioService.java有以下实现:
@Service
public class UsuarioService implements UserDetailsService {
private UsuarioDao usuario;
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public UserDetails loadUserByUsername(String arg0) throws UsernameNotFoundException {
Usuario account = usuario.findByField("login", arg0);
if(account==null) {
throw new UsernameNotFoundException("No such user: " + arg0);
} else if (account.getAutorizacao().isEmpty()) {
throw new UsernameNotFoundException("User " + arg0 + " has no authorities");
}
boolean accountIsEnabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
return new User(account.getLogin(), account.getSenha(), accountIsEnabled, accountNonExpired, credentialsNonExpired, accountNonLocked, getAuthorities(account.getAutorizacao()));
}
public List<String> getRolesAsList(List<Autorizacao> list) {
List <String> rolesAsList = new ArrayList<String>();
for(Autorizacao role : list){
rolesAsList.add(role.getNome());
}
return rolesAsList;
}
public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) {
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (String role : roles) {
authorities.add(new SimpleGrantedAuthority(role));
}
return authorities;
}
public Collection<? extends GrantedAuthority> getAuthorities(List<Autorizacao> list) {
List<GrantedAuthority> authList = getGrantedAuthorities(getRolesAsList(list));
return authList;
}
}
@服务
公共类USUARIService实现UserDetailsService{
私人用武之地;
@事务性(只读=true,传播=propagation.SUPPORTS)
public UserDetails loadUserByUsername(字符串arg0)引发UsernameNotFoundException{
Usuario帐户=Usuario.findByField(“登录”,arg0);
如果(帐户==null){
抛出新的UsernameNotFoundException(“没有这样的用户:+arg0”);
}else if(account.getautorizao().isEmpty()){
抛出新的UsernameNotFoundException(“用户”+arg0+“没有权限”);
}
布尔值accountIsEnabled=true;
布尔值accountNonExpired=true;
布尔CredentialsNoExpired=true;
布尔值accountNonLocked=true;
返回新用户(account.getLogin()、account.getSenha()、accountIsEnabled、accountNonExpired、credentialsnexpired、accountNonLocked、getAuthorities(account.getautorizao());
}
公共列表获取角色列表(列表列表){
列表角色列表=新建ArrayList();
用于(自动编辑角色:列表){
添加(role.getNome());
}
返回角色列表;
}
公共静态列表GetGrantedAuthories(列表角色){
列表权限=新建ArrayList();
for(字符串角色:角色){
添加(新的SimpleGrantedAuthority(角色));
}
返回当局;
}
public Collection您正在SpringConfig中自动连接一个具体的类(UsuarioService
),而不是一个接口(UserDetailsService
)
您应该在配置中自动连线UserDetailsService
:
@Autowired
private UserDetailsService usuario;
您正在SpringConfig中自动连接一个具体的类(USUARIService
),而不是一个接口(UserDetailsService
)
您应该在配置中自动连线UserDetailsService
:
@Autowired
private UserDetailsService usuario;
好的,我现在可以试试,但是当我需要(并且我会)自定义UserDetailsService实现时?您已经为自定义实现提供了UsuarioService
类,该类实现了UserDetailsService
,是Spring管理的bean。Spring将注入(并使用)当在config.Ok中连接UserDetailsService依赖项时,我现在可以尝试这个实现,但是当我需要时(我会)自定义UserDetailsService实现?您已经为自定义实现提供了UsuarioService
类,该类实现了UserDetailsService
,是Spring管理的bean。Spring将在配置中连接UserDetailsService依赖项时注入(并使用)该实现。