Java 无法将spring.example.service.usuario服务字段spring.example.config.security.SecurityConfig.usuario设置为$Proxy47

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

运行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.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依赖项时注入(并使用)该实现。