Parameter 0 of method setUserService in <method> required a bean of type <service> that could not be found
Asked Answered
I

2

9

I have been through this issue and couldn't find what is going on.... tried to @ComponentScan, tried to name my services, none seems to work.

Error:

03:35:05,193 WARN  [org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext] (ServerService Thread Pool -- 81) Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfiguration': Unsatisfied dependency expressed through method 'setAuthenticationProvider' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoAuthenticationProvider' defined in class path resource [com/ipayso/config/SecurityConfiguration.class]: Unsatisfied dependency expressed through method 'daoAuthenticationProvider' parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDetailsService': Unsatisfied dependency expressed through method 'setUserService' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.ipayso.services.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
03:35:05,193 INFO  [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] (ServerService Thread Pool -- 81) Closing JPA EntityManagerFactory for persistence unit 'default'
03:35:05,194 INFO  [org.hibernate.tool.hbm2ddl.SchemaExport] (ServerService Thread Pool -- 81) HHH000227: Running hbm2ddl schema export
03:35:05,196 INFO  [stdout] (ServerService Thread Pool -- 81) Hibernate: drop table if exists customer cascade
03:35:05,200 INFO  [stdout] (ServerService Thread Pool -- 81) Hibernate: drop table if exists private_key cascade
03:35:05,205 INFO  [stdout] (ServerService Thread Pool -- 81) Hibernate: drop table if exists public_key cascade
03:35:05,208 INFO  [stdout] (ServerService Thread Pool -- 81) Hibernate: drop table if exists user_login cascade
03:35:05,211 INFO  [stdout] (ServerService Thread Pool -- 81) Hibernate: drop sequence hibernate_sequence
03:35:05,213 INFO  [org.hibernate.tool.hbm2ddl.SchemaExport] (ServerService Thread Pool -- 81) HHH000230: Schema export complete
03:35:05,223 WARN  [org.springframework.boot.SpringApplication] (ServerService Thread Pool -- 81) Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available)
03:35:05,262 WARN  [org.jboss.modules] (ServerService Thread Pool -- 81) Failed to define class org.springframework.boot.autoconfigure.data.rest.SpringBootRepositoryRestConfigurer in Module "deployment.devipayso-1.0.war:main" from Service Module Loader: java.lang.NoClassDefFoundError: Failed to link org/springframework/boot/autoconfigure/data/rest/SpringBootRepositoryRestConfigurer (Module "deployment.devipayso-1.0.war:main" from Service Module Loader): org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerAdapter

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setUserService in com.ipayso.services.security.UserDetailsServiceImpl required a bean of type 'com.ipayso.services.UserService' that could not be found.


Action:

Consider defining a bean of type 'com.ipayso.services.UserService' in your configuration.

My SecurityConfiguration:

package com.project.config
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

private AuthenticationProvider authenticationProvider;

@Autowired
@Qualifier("daoAuthenticationProvider")
public void setAuthenticationProvider(AuthenticationProvider authenticationProvider) {
    this.authenticationProvider = authenticationProvider;
}

@Bean
public PasswordEncoder passwordEncoder(StrongPasswordEncryptor passwordEncryptor){
    PasswordEncoder passwordEncoder = new PasswordEncoder();
    passwordEncoder.setPasswordEncryptor(passwordEncryptor);
    return passwordEncoder;
}

@Bean
public DaoAuthenticationProvider daoAuthenticationProvider(PasswordEncoder passwordEncoder, UserDetailsService userDetailsService){
    DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
    daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
    daoAuthenticationProvider.setUserDetailsService(userDetailsService);
    return daoAuthenticationProvider;
}

@Autowired
public void configureAuthManager(AuthenticationManagerBuilder authenticationManagerBuilder){
    authenticationManagerBuilder.authenticationProvider(authenticationProvider);
}

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
            .authorizeRequests().antMatchers("/", "/home", "/login", "/signup").permitAll()
        .and()
            .formLogin()
            .loginPage("/login")
            .failureUrl("/login-error")
        .and()
            .logout()
            .logoutSuccessUrl("/home");
}
}

My UserDetailServiceImpl:

package com.project.service.security
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

private UserService userService;
private Converter<User, UserDetails> userUserDetailsConverter;

@Autowired
@Qualifier(value = "userService")
public void setUserService(UserService userService) {
    this.userService = userService;
}

@Autowired
@Qualifier(value = "userToUserDetails")
public void setUserUserDetailsConverter(Converter<User, UserDetails> userUserDetailsConverter) {
    this.userUserDetailsConverter = userUserDetailsConverter;
}

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    return userUserDetailsConverter.convert(userService.findByEmail(email));
}
}

My UserServiceImpl:

package com.project.service
@Service
@Profile("springdatajpa")
public class UserServiceImpl implements UserService{

private UserRepository userRepository;

@Autowired
public void setUserRepository(UserRepository userRepository) {
    this.userRepository = userRepository;
 }

private EncryptionService encryptionService;

@Autowired
public void setEncryptionService(EncryptionService encryptionService) {
    this.encryptionService = encryptionService;
}


@Override
public List<?> listAll() {
    List<User> users = new ArrayList<>();
    userRepository.findAll().forEach(users::add); //fun with Java 8
    return users;
}

@Override
public User getById(Integer id) {
    return userRepository.findOne(id);
}

@Override
public User saveOrUpdate(User domainObject) {
    if(domainObject.getPassword() != null){
        domainObject.setEncryptedPassword(encryptionService.encryptString(domainObject.getPassword()));
    }
    return userRepository.save(domainObject);
}
@Override
@Transactional
public void delete(Integer id) {
    userRepository.delete(id);
}

@Override
public User findByEmail(String email) {
    return userRepository.findByEmail(email);
}
}

My CommonBeanConfig:

package com.project.config
@Configuration
public class CommonBeanConfig {

@Bean
public StrongPasswordEncryptor strongEncryptor(){
    StrongPasswordEncryptor encryptor = new StrongPasswordEncryptor();
    return encryptor;
}
}

My App:

package com.project
@SpringBootApplication
public class App extends SpringBootServletInitializer{

public static void main(String[] args) {
    SpringApplication.run(applicationClass, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(applicationClass);
}

private static Class<App> applicationClass = App.class;
}

My RepositoryConfiguration:

package com.project.config
@Configuration
@EnableAutoConfiguration
@EntityScan(basePackages = {"com.ipayso.model"})
@EnableJpaRepositories(basePackages = {"com.ipayso.repositories"})
@EnableTransactionManagement
public class RepositoryConfiguration {

}
Imaginative answered 9/2, 2017 at 7:3 Comment(1)
Please cut a bit your code.Hyperphysical
R
13

You are looking for UserService with @Qualifier(value = "userService") here:

@Autowired
@Qualifier(value = "userService")
public void setUserService(UserService userService) {
    this.userService = userService;
}

but you don't have it, since your UserServiceImpl annotated as @Service without providing it's id.

To set id to your your UserServiceImpl, you need to annotate it with @Service("userService"). But if you have a single UserService implementation, just delete @Qualifier(value = "userService") from setter, because it's redundant.

And it seems to me, it's not the only place, where you have to remove a @Qualifier.

@Qualifier annotation is needed to select exact bean if you have a number of beans of the same type. If you have a single one, you don't need to use it.

Rumen answered 9/2, 2017 at 7:18 Comment(3)
+1 to this answer. Check the following Spring article about the @Qualifier annotation spring.io/blog/2014/11/04/a-quality-qualifierGally
You are right, the problem was calling my service through @Qualifier when I didn't have a name for it.Nippy
@CléberOliveira if this answer solved your problem, you can accept it, to make it easier to find an answer for someone in futureRumen
H
2

If you get this error while running the junit test, chances are that you may need to add the mock for the object

@MockBean ClassError classError; in the class which has @SpringBootConfiguration annotation

Hendren answered 18/1, 2019 at 3:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.