【发布时间】: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