0
votes
@Configuration
public class WebSecurityConfig  extends WebSecurityConfigurerAdapter {

private final Log log = LogFactory.getLog(WebSecurityConfig.class);

@Value("${spring.profiles.active}")
private String env;

@Value("${rememberMe.privateKey}")
private String rememberMeKey;

@Resource
private UserDetailsService userService;

@Bean
public RememberMeServices rememberMeServices() {

    TokenBasedRememberMeServices rememberMeServices = new TokenBasedRememberMeServices(rememberMeKey, userService);

    // See http://stackoverflow.com/questions/25565809/implementing-a-remember-me-for-spring-social
    rememberMeServices.setAlwaysRemember(true);

    return rememberMeServices;

}

@Bean
public PasswordEncoder passwordEncoder() {
  log.info("Creating password encoder bean");
  return new BCryptPasswordEncoder();
}


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

    http
        .authorizeRequests()
            .antMatchers("/",
                    "/signup",
                    "/public/**",
                    "/users/*",
                    "/auth/**").permitAll()
            .anyRequest().authenticated();

    http
        .formLogin()
            .loginPage("/signin")
            .permitAll().and()
        .rememberMe().key(rememberMeKey).rememberMeServices(rememberMeServices()).and()
        .logout()
            .deleteCookies("JSESSIONID")
            .permitAll()
        .and().apply(new SpringSocialConfigurer());

    if (!env.equals("dev"))
        http.requiresChannel().anyRequest().requiresSecure();

}

@Autowired
@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
    authManagerBuilder.userDetailsService(userService).passwordEncoder(passwordEncoder());
}

}

as a UserDetailsService I have the following:

@Service
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
public class UserServiceImpl implements UserService, UserDetailsService,  SocialUserDetailsService {

private final Logger log = Logger.getLogger(this.getClass());

private UserRepository userRepository;
private PasswordEncoder passwordEncoder;

@Autowired
public UserServiceImpl(UserRepository userRepository,
        PasswordEncoder passwordEncoder) {

    this.userRepository = userRepository;
    this.passwordEncoder = passwordEncoder;

}

@Override
public SocialUserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {
    User user = userRepository.findByEmail(username);
    if (user == null)
        throw new UsernameNotFoundException(username);

    return new UserDetailsImpl(user);
}

@Override
public User findOne(long userId) {

    User user = userRepository.findOne(userId);
    return user;

}

@Override
@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
public User signup(SignupForm signupForm) {
    final User user = new User();
    user.setEmail(signupForm.getEmail());
    user.setName(signupForm.getName());
    user.setPassword(passwordEncoder.encode(signupForm.getPassword()));
    userRepository.save(user);
    MyUtil.logInUser(user);
    return user;        
}

@Override
@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
public void update(long userId, UserEditForm userEditForm) {

    User user = userRepository.findOne(userId);
    user.setName(userEditForm.getName());
    userRepository.save(user);

}

@Override
public SocialUserDetails loadUserByUserId(String userId)
        throws UsernameNotFoundException, DataAccessException {
    return loadUserByUsername(userId);
}

}

I'm getting the following error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSecurityConfig': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl' defined in file [/home/hardddisk/applications/tomcat8/webapps/ROOT/WEB-INF/classes/com/kefet/controller/UserServiceImpl.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.kefet.controller.UserRepository]: : No qualifying bean of type [com.kefet.controller.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.kefet.controller.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:311) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1768) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl' defined in file [/home/hardddisk/applications/tomcat8/webapps/ROOT/WEB-INF/classes/com/kefet/controller/UserServiceImpl.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.kefet.controller.UserRepository]: : No qualifying bean of type [com.kefet.controller.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.kefet.controller.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:508) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:486) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:615) at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:308) ... 26 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.kefet.controller.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ... 44 more

Thank you.

1

1 Answers

0
votes

error message claims it cant find UserRepository class to autowire into your constructor. You have to annotate this class with @Component ( or some subannotation of it like @Repository / @Service ) to make it available for autowiring.

//update:

First of all - if you are starting this project from scratch I would suggest looking into spring boot - it would simplify a lot of configuration for you.

You did not mention that you are trying to use spring data jpa here. You have to somehow let spring know where your interfaces are. This is done by @EnableJpaRepositories. Add

@EnableJpaRepositories(basePackages = "com.kefet.controller")

above your DatabaseConfig. Then it will complain it needs entityManagerFactory. Add:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws SQLException {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

    DataSource dataSource = dataSource();
    entityManagerFactoryBean.setDataSource(dataSource);
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

    entityManagerFactoryBean.setJpaProperties(jpaProperties());
    entityManagerFactoryBean.setPackagesToScan("com.kefet.controller");

    return entityManagerFactoryBean;
}

@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
    return new HibernateExceptionTranslator();
}

protected Properties jpaProperties() {
    Properties jpaProperties = new Properties();
    jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect");
    jpaProperties.put(org.hibernate.cfg.Environment.SHOW_SQL, false);
    return jpaProperties;
}

to same DatabaseConfig class.

This will solve initial problem of this post. You will get further errors (No qualifying bean of type [org.springframework.social.facebook.api.Facebook]) but you need to fix them one by one.