Hello I implementing Spring Security. I Found error while I Application is run. Not Creating Bean Produce Error.
Error creating bean with name 'securityFilterChain' defined in class path resource [com/compilers/tripsntours/config/SecurityConfig.class]: Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method 'securityFilterChain' threw exception with message: Cannot invoke "java.lang.Object.getClass()" because "filter" is null
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0: Error creating bean with name 'securityFilterChain' defined in class path resource [com/compilers/tripsntours/config/SecurityConfig.class]: Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method 'securityFilterChain' threw exception with message: Cannot invoke "java.lang.Object.getClass()" because "filter" is null
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:817) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:769) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:127) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:481) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1397) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:961) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:915) ~[spring-context-6.0.2.jar:6.0.2]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[spring-context-6.0.2.jar:6.0.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.0.jar:3.0.0]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-3.0.0.jar:3.0.0]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) ~[spring-boot-3.0.0.jar:3.0.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-3.0.0.jar:3.0.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-3.0.0.jar:3.0.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) ~[spring-boot-3.0.0.jar:3.0.0]
at com.compilers.tripsntours.TripsnToursApplication$Companion.main(TripsnToursApplication.kt:65) ~[main/:na]
at com.compilers.tripsntours.TripsnToursApplication.main(TripsnToursApplication.kt) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-3.0.0.jar:3.0.0]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityFilterChain' defined in class path resource [com/compilers/tripsntours/config/SecurityConfig.class]: Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method 'securityFilterChain' threw exception with message: Cannot invoke "java.lang.Object.getClass()" because "filter" is null
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:652) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:640) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1324) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1161) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1621) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1585) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1476) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1363) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:809) ~[spring-beans-6.0.2.jar:6.0.2]
... 26 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.web.SecurityFilterChain]: Factory method 'securityFilterChain' threw exception with message: Cannot invoke "java.lang.Object.getClass()" because "filter" is null
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.0.2.jar:6.0.2]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:648) ~[spring-beans-6.0.2.jar:6.0.2]
... 42 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke "java.lang.Object.getClass()" because "filter" is null
at org.springframework.security.config.annotation.web.builders.HttpSecurity.addFilterAtOffsetOf(HttpSecurity.java:3056) ~[spring-security-config-6.0.0.jar:6.0.0]
at org.springframework.security.config.annotation.web.builders.HttpSecurity.addFilterBefore(HttpSecurity.java:3050) ~[spring-security-config-6.0.0.jar:6.0.0]
at com.compilers.tripsntours.config.SecurityConfig.securityFilterChain(SecurityConfig.kt:62) ~[main/:na]
at com.compilers.tripsntours.config.SecurityConfig$$SpringCGLIB$$0.CGLIB$securityFilterChain$3(<generated>) ~[main/:na]
at com.compilers.tripsntours.config.SecurityConfig$$SpringCGLIB$$2.invoke(<generated>) ~[main/:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:257) ~[spring-core-6.0.2.jar:6.0.2]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-6.0.2.jar:6.0.2]
at com.compilers.tripsntours.config.SecurityConfig$$SpringCGLIB$$0.securityFilterChain(<generated>) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.2.jar:6.0.2]
... 43 common frames omitted
SecurityConfig.kt
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
//@EnableJpaRepositories
//@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig {
@Autowired
val customUserDetailservice : CustomUserDetailservice ?= null
@Autowired
val jwtAuthenticationFilter : JwtAuthenticationFilter ?= null
@Autowired
val jwtAuthenticationEntryRequestPoint: JwtAuthenticationEntryRequestPoint ?= null
@Bean
fun securityFilterChain(http: HttpSecurity) : SecurityFilterChain {
http
.csrf()
.disable()
.authorizeHttpRequests { requests ->
requests
.requestMatchers("/api/user/login","/api/user/registerUser")
.permitAll()
.anyRequest()
.authenticated()
.and()
// .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java)
.exceptionHandling()
.authenticationEntryPoint(this.jwtAuthenticationEntryRequestPoint)
}
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java)
http.authenticationProvider(daoAuthenticationProvider())
val build : DefaultSecurityFilterChain = http.build()
return build
}
@Bean
fun passwordEncoder(): PasswordEncoder {
return BCryptPasswordEncoder()
}
@Bean
fun daoAuthenticationProvider(): DaoAuthenticationProvider? {
val provider = DaoAuthenticationProvider()
provider.setUserDetailsService(this.customUserDetailservice)
provider.setPasswordEncoder(passwordEncoder())
return provider
}
@Bean
@Primary
@Throws(Exception::class)
fun authepnticationManagerBean(configuration: AuthenticationConfiguration): AuthenticationManager? {
return configuration.authenticationManager
}
}
JwtAuthenticationFilter.kt
@Component
class JwtAuthenticationFilter : OncePerRequestFilter() {
@Autowired
private val userDetailsService: UserDetailsService? = null
@Autowired
private val jwtTokenHelper: JwtTokenHelper? = null
@Throws(ServletException::class, IOException::class)
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
filterChain: FilterChain
) {
// 1. get token
val requestToken = request.getHeader("Authorization")
val headerNames = request.headerNames
while (headerNames.hasMoreElements()) {
println(headerNames.nextElement())
}
// Bearer 2352523sdgsg
println(requestToken)
var username: String? = null
var token: String? = null
if (requestToken != null && requestToken.startsWith("Bearer")) {
token = requestToken.substring(7)
try {
username = jwtTokenHelper!!.getUsernameFromToken(token)
} catch (e: IllegalArgumentException) {
println("Unable to get Jwt token")
} catch (e: ExpiredJwtException) {
println("Jwt token has expired")
} catch (e: MalformedJwtException) {
println("invalid jwt")
}
} else {
println("Jwt token does not begin with Bearer")
}
// once we get the token , now validate
if (username != null && SecurityContextHolder.getContext().authentication == null) {
val userDetails = userDetailsService!!.loadUserByUsername(username)
if (jwtTokenHelper!!.validateToken(token, userDetails)) {
val usernamePasswordAuthenticationToken = UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.authorities
)
usernamePasswordAuthenticationToken.details = WebAuthenticationDetailsSource().buildDetails(request)
SecurityContextHolder.getContext().authentication = usernamePasswordAuthenticationToken
} else {
println("Invalid jwt token")
}
} else {
println("username is null or context is not null")
}
filterChain.doFilter(request, response)
}
}
Main Class.kt
@SpringBootApplication
class TripsnToursApplication : CommandLineRunner {
@Autowired
val passwordEncode: PasswordEncoder? = null
@Autowired
private val roleRepo: RoleRepo? = null
companion object {
@JvmStatic
fun main(args: Array<String>) {
runApplication<TripsnToursApplication>(*args)
}
}
@Throws(Exception::class)
override fun run(vararg args: String?) {
try {
val role1 = Role()
role1.id = ADMIN_USER
role1.name = "ROLE_ADMIN"
val role2 = Role()
role2.id = TOURIST_USER
role2.name = "ROLE_TOURIST"
val role3 = Role()
role3.id = AGENCEY_USER
role3.name = "ROLE_AGENCY"
val roles: List<Role> = listOf(role1, role2, role3)
val result: List<Role> = roleRepo!!.saveAll(roles)
result.forEach(Consumer<Role> { r: Role -> System.out.println(r.name) })
} catch (e: Exception) {
e.printStackTrace()
}
}
}