Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/web/servlet/ServletContextInitializer with VaadinWebSecurity

I am trying to build the normal Spring MVC demo app with Spring security enabled (Without Spring Boot)

vaadin flow : 24.4.6
vaadin-spring : 24.4.4
Spring-webmvc: 6.1.11
spring-security-core & spring-security-web : 6.3.1

Tomcat 10 for deploying war

public class SampleWebAppInitializer extends VaadinMVCWebAppInitializer {

	@Override
	protected Collection<Class<?>> getConfigurationClasses() {
		return Arrays.asList( SampleConfiguration.class);
	}
}

@Configuration
@ComponentScan
@EnableVaadin
@EnableWebSecurity
public class SampleConfiguration {
	@Bean
	public HandlerMappingIntrospector mvcHandlerMappingIntrospector() {
		return new HandlerMappingIntrospector();
	}

}


@EnableWebSecurity
@Configuration
@ComponentScan( value = { "org.vaadin.example", "com.vaadin.flow.spring"})
public class SecurityConfiguration extends VaadinWebSecurity {

	public SecurityConfiguration(){
		super();
	}

	@Override
	protected void configure( final HttpSecurity http) throws Exception {
	
		super.configure(http);

		// This is important to register your login view to the
		// navigation access control mechanism:
		setLoginView(http, LoginRichContent.class);
		http.logout(logout -> logout
				.logoutSuccessUrl("/login-rich-content")
			);
		http.build();
	}

	@Override
	public void configure( final WebSecurity web) throws Exception {
		// Customize your WebSecurity configuration.
		super.configure(web);
	}

	/**
	 * Demo UserDetailsManager which only provides two hardcoded
	 * in memory users and their roles.
	 * NOTE: This shouldn't be used in real world applications.
	 */
	@Bean
	public UserDetailsManager userDetailsService() {
		final UserDetails user =
			User.withUsername("user")
				.password("{noop}user")
				.roles("USER")
				.build();
		final UserDetails admin =
			User.withUsername("admin")
				.password("{noop}admin")
				.roles("ADMIN")
				.build();
		return new InMemoryUserDetailsManager(user, admin);
	}
}

and getting below error on tomcat starting

	Caused by: java.lang.IllegalStateException: Failed to introspect Class [com.vaadin.flow.spring.SpringBootAutoConfiguration] from ClassLoader [ParallelWebappClassLoader
  context: vaadin
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@6477463f
----------> Class file transformers:
org.apache.tomcat.jakartaee.ClassConverter[TOMCAT]
]
		at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:483)
		at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:360)
		at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:417)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$1(AbstractAutowireCapableBeanFactory.java:750)
		at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:749)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:682)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:653)
		at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1687)
		at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:562)
		at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:534)
		at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:122)
		at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:789)
		at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:607)
		at com.vaadin.flow.spring.VaadinMVCWebAppInitializer.onStartup(VaadinMVCWebAppInitializer.java:55)
		at org.vaadin.example.SampleWebAppInitializer.onStartup(SampleWebAppInitializer.java:14)
		at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
		at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4850)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
		... 38 more
	Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/web/servlet/ServletContextInitializer
		at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
		at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3402)
		at java.base/java.lang.Class.getDeclaredMethods(Class.java:2504)
		at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:465)
		... 56 more
	Caused by: java.lang.ClassNotFoundException: org.springframework.boot.web.servlet.ServletContextInitializer
		at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1437)
		at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1245)
		... 60 more

Has anyone faces this issue , how to solve it ?

What are you trying to achieve?

If I understand you want to create a Vaadin application that can be deployed to a Tomcat as WAR?

hello @SimonMartinelli
yes
I am trying to build vaadin application (Spring MVC + Spring Security )that I want to deploy as war, but without spring boot setup / config

Most likely, you have to exclude Hilla dependencies.

Take a look at the example on how to exclude Hilla from the upgrade guide

Why without Spring Boot? Spring Boot would make your life much simpler.

Hello @marcoc_753 ,

yes I had followed it ,
but was facing the same issue ,

then I had added below dependencies explicitly
seems like vaadin-spring needs it even though its optional dependency of its own (I may be wrong here )

 <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-spring-boot-starter</artifactId>
            <version>24.4.7</version>
            <exclusions>
                <exclusion>
                    <groupId>com.vaadin</groupId>
                    <artifactId>vaadin-spring</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>hilla</artifactId>
                    <groupId>com.vaadin</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>vaadin-core</artifactId>
                    <groupId>com.vaadin</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-webmvc</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-web</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

and after adding this I was not facing this error ,

is it right/ok to add this dependency for non spring boot app to make it work

Actually, you should not need to add vaadin-spring-boot-starter. You should only add vaadin-springand exclude hilla from com.vaadin:vaadin (or com.vaadin:vaadin-core)