【问题标题】:spring security Injection of autowired dependencies failed自动装配依赖项的spring security注入失败
【发布时间】:2016-09-17 00:24:43
【问题描述】:

我查看了至少 10 个不同的答案,但没有任何建议有帮助。

我刚刚开始使用 Spring 安全性,但一直收到错误消息:

spring security Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException

这是让我想到这一点的代码:

ApplicationContextConfig

@EnableWebMvc
@Configuration
@ComponentScan(basePackages ="com.lisawestberg.noxml.controller, com.lisawestberg.noxml.service, com.lisawestberg.noxml.dao.impl, com.lisawestberg.noxml.domain")
@EnableTransactionManagement
@Import({ LoginConfig.class })
public class ApplicationContextConfig extends WebMvcConfigurerAdapter {



@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
            .addResourceHandler("/resources/**")
            .addResourceLocations("/resources/");
}

@Bean(name = "viewResolver")
public InternalResourceViewResolver getViewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/pages/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

@Bean(name = "dataSource")
public DataSource getDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.apache.derby.jdbc.ClientDriver");
    dataSource.setUrl("jdbc:derby://localhost:1527/School");
    dataSource.setUsername("root");
    dataSource.setPassword("rootroot");
    return dataSource;
}

private Properties getHibernateProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.show_sql", "false");
    properties.put("hibernate.hbm2ddl.auto", "update");
    properties.put("current_session_context_class", "thread");
    return properties;
}

@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
    sessionBuilder.addProperties(getHibernateProperties());
    sessionBuilder.addAnnotatedClass(Course.class);
    sessionBuilder.addAnnotatedClass(CourseStudent.class);
    sessionBuilder.addAnnotatedClass(Roll.class);
    sessionBuilder.addAnnotatedClass(Student.class);
    sessionBuilder.addAnnotatedClass(Faculty.class);
    return sessionBuilder.buildSessionFactory();
}

@Autowired
@Bean(name = "transactionManager")
public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
    return transactionManager;
}

@Autowired
@Bean(name = "courseDao")
public CourseDAO getCourseDao(SessionFactory sessionFactory) {
    return new CourseDaoImpl();
}

@Autowired
@Bean(name = "facultyDao")
public FacultyDAO getFacultyDao(SessionFactory sessionFactory) {
    return new FacultyDaoImpl();
}

@Autowired
@Bean(name = "rolesDao")
public RolesDAO getRolesDao(SessionFactory sessionFactory) {
    return new RolesDaoImpl();
}

@Autowired
@Bean(name = "studentDao")
public StudentDAO getStudentDao(SessionFactory sessionFactory) {
    return new StudentDaoImpl();
}

@Autowired
@Bean(name="courseStudentDao")
public CourseStudentDAO getCourseStudentDao(SessionFactory sessionFactory){
    return new CourseStudentDaoImpl();
}    
}

SpringWebAppInitializer

public class SpringWebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) throws ServletException {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.register(ApplicationContextConfig.class);
    context.setServletContext(container);
    context.register(LoginService.class, FacultyDAO.class);

    ServletRegistration.Dynamic dispatcher = container.addServlet("SpringDispatcher", new DispatcherServlet(context));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
}   
}

登录配置

@Configuration
@EnableWebSecurity
public class LoginConfig extends WebSecurityConfigurerAdapter {

@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests().antMatchers("/admin/**")
            .access("hasRole('ROLE_ADMIN')").and().formLogin()
            .loginPage("/login").failureUrl("/login?error")
            .usernameParameter("username")
            .passwordParameter("password")
            .and().logout().logoutSuccessUrl("/login?logout")
            .and().csrf()
            .and().exceptionHandling().accessDeniedPage("/403");
}

@Bean
public PasswordEncoder passwordEncoder() {
    PasswordEncoder encoder = new BCryptPasswordEncoder();
    return encoder;
}   
}

FacultyDaoImpl

@Repository("facultyDao")
public class FacultyDaoImpl extends HibernateDao<Faculty,Integer> implements FacultyDAO {

@Override
public Faculty findByLogin(String login) {
    List<Faculty> allFaculty = new ArrayList<>();

    allFaculty = currentSession().createQuery("select f from faculty f where login = :login").list();

    if (!allFaculty.isEmpty()){
        return allFaculty.get(0);
    } else {
        return null;
    }
}
}

用户详细信息服务

@Service("userDetailsService")
public class LoginService implements UserDetailsService {

@Autowired
FacultyDAO dao;

@Transactional(readOnly = true)
public UserDetails loadUserByUsername(final String login) throws UsernameNotFoundException {
    Faculty faculty = dao.findByLogin(login);
    List<GrantedAuthority> authorities = buildUserAuthority(faculty.getRoles());
    return buildUserForAuthentication(faculty, authorities);
}

private User buildUserForAuthentication(Faculty faculty, List<GrantedAuthority> authorities) {
    return new User(faculty.getLogin(), faculty.getPassword(), faculty.isEnabled(), true, true, true, authorities);
}

private List<GrantedAuthority> buildUserAuthority(Set<Roll> roleSet) {
    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
    // Build user's authorities
    for (Roll roles : roleSet) {
        setAuths.add(new SimpleGrantedAuthority(roles.getRoleTitle()));
    }
    List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
    return Result;
}
}

当然还有堆栈跟踪。我会为你省去所有无聊的部分。堆栈跟踪超过 1000 行:

Info:   Security Service(s) started successfully.
Severe:   Class [ com/querydsl/core/dml/UpdateClause ] not found. Error while loading [ class 

Severe:   SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
Severe:   SLF4J: Defaulting to no-operation (NOP) logger implementation
Severe:   SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Severe:   WebModule[/noxml]Servlet dispatcher threw unload() exception
javax.servlet.ServletException: Servlet.destroy() for servlet dispatcher threw exception
at       org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1913)
Severe:   ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException:    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDetailsService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:   Could not autowire field: com.lisawestberg.noxml.dao.FacultyDAO com.lisawestberg.noxml.service.LoginService.dao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.lisawestberg.noxml.dao.FacultyDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5985)

【问题讨论】:

  • 一般情况下 - 我看到您正在学习 spring,但尝试做的事情太快了。尝试放慢工作速度,阅读手册并一次编写一个 bean(在单元测试之间):)

标签: hibernate spring-mvc spring-security


【解决方案1】:

别忘了把你的例外读到最后:

嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 找到类型 [com.lisawestberg.noxml.dao.FacultyDAO] 的合格 bean 对于依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

您的 bean 声明不正确。您在吸气剂上使用@Autowire

@Autowired
@Bean(name = "facultyDao")
public FacultyDAO getFacultyDao(SessionFactory sessionFactory) {
    return new FacultyDaoImpl();
}

@Autowire 只能用于属性或 setter,不能用于 getter。尽管那个 spring 正在尝试寻找一种 bean 来注入,但目前它还没有。

首先,从所有 bean 声明中删除 @Autowire,并且只在您想要自动注入(“wire”)bean 实例的地方使用它。

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2013-05-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多