Spring - 在重写方法中添加支持方面的注释时,Autowire失败

时间:2014-09-22 11:14:26

标签: spring spring-security spring-aop

我有一个实现org.springframework.security.core.userdetails.UserDetailsS​​ervice的身份验证服务,并定义为:

@Service
public class AuthService implements UserDetailsService {
    // Autowires ..

    @Override
    //@Logged(successMessage = "User %s logged in")
    public UserDetails loadUserByUsername(String username) { .. }
}

它自动连接到WebSecurityConfigurerAdapter的扩展中,用于配置身份验证:

// Annotations ...
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private AuthService authService;

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        auth.userDetailsService(authService).passwordEncoder(encoder);
    }
    // Other security config stuff ...
}

最后,我创建了一个名为@Logged的自定义注释,该注释由一个方面提取,该方面应用于带注释方法的建议并执行一些记录逻辑。让我们说如果你只传递一个参数,它将记录成功的返回。

将@Logged注释应用于重写的AuthService.loadUserByUsername方法会导致应用程序在启动时崩溃,从而显示无法将AuthService自动装入SecurityConfig的消息。如果我没有将注释放到重写方法中,那么一切都会完美无缺 - 认证工作(完成自动装配)和记录注释在系统的其他部分工作。

问题

为什么会发生这种情况并且可以修复?

我真的想使用我的花式日志记录来记录那个确切的方法。 谢谢:))

技术细节

Spring 4 with Boot,Jetty 9

堆栈跟踪(部分):

2014-09-22 12:41:05 WARN AbstractLifeCycle - FAILED org.springframework.boot.context.embedded.jetty.ServletContextInitializerConfiguration$InitializerListener@8bb473:org.springframework.beans.factory.BeanCreationException:使用名称创建bean时出错' org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration&#39 ;:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配方法:public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.setFilterChainProxySecurityConfigurer(org.springframework.security.config.annotation.ObjectPostProcessor, java.util.List)抛出java.lang.Exception;嵌套异常是org.springframework.beans.factory.BeanExpressionException:表达式解析失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为' securityConfig'的注册自动连接依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.bluepixelflag.services.AuthService com.bluepixelflag.config.SecurityConfig.authService;嵌套异常是java.lang.IllegalArgumentException:无法将com.bluepixelflag.services.AuthService字段com.bluepixelflag.config.SecurityConfig.authService设置为com.sun.proxy。$ Proxy90

1 个答案:

答案 0 :(得分:2)

Spring正在使用代理向AuthService添加方面。没有注释,它只会使用一个简单的类。

更改

private AuthService authService;

private UserDetailsService authService;

它应该有效。或者,使用cglib代理而不是JDK动态代理。

除此之外:使用方面进行日志记录的目的是尝试避免每次日志记录调用一行代码。如果您为要记录的每个方法调用使用方面注释,那么您没有保存任何复杂性(实际上您已经增加了它),并且可能只是在代码中调用记录器。