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.
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.
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");
}
}
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));
}
}
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);
}
}
CommonBeanConfig
:package com.project.config
@Configuration
public class CommonBeanConfig {
@Bean
public StrongPasswordEncryptor strongEncryptor(){
StrongPasswordEncryptor encryptor = new StrongPasswordEncryptor();
return encryptor;
}
}
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;
}
RepositoryConfiguration
:package com.project.config
@Configuration
@EnableAutoConfiguration
@EntityScan(basePackages = {"com.ipayso.model"})
@EnableJpaRepositories(basePackages = {"com.ipayso.repositories"})
@EnableTransactionManagement
public class RepositoryConfiguration {
}
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With