Abdubek Zholay
Abdubek Zholay

Reputation: 49

In the configuration there is an error about DispatcherServletPath

Error output, error occurs when the application starts and in the version spring-boot-starter-parent 2.0.5.RELEASE, in 1.5 versions it works fine. In versions 2.0.5 the distribution of the SpringBootServletInitializer file has changed;

Dependency annotations: {}
19:03:05.312 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter - 

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

Description:

Parameter 1 of constructor in 
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration required a bean of type 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath' that could not be found.
- Bean method 'dispatcherServletRegistration' not loaded because DispatcherServlet Registration found servlet registration bean dispatcherServletRegistration


Action:

Consider revisiting the entries above or defining a bean of type 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath' in your configuration.

Configuration:

@SpringBootApplication
@Import({
    CityContextConfig.class,
    CityPersistenceJpaConfig.class,
    CityServiceConfig.class,
    CityWebConfig.class
})
public class CityApp extends SpringBootServletInitializer {

@Bean
public DispatcherServlet dispatcherServlet() {
    return new DispatcherServlet();
}

@Bean
public ServletRegistrationBean dispatcherServletRegistration() {
    final ServletRegistrationBean registration = new ServletRegistrationBean<>(dispatcherServlet(), "/api/*");

    final Map<String, String> params = new HashMap<String, String>();
    params.put("contextClass", "org.springframework.web.context.support.AnnotationConfigWebApplicationContext");
    params.put("contextConfigLocation", "org.spring.sec2.spring");
    params.put("dispatchOptionsRequest", "true");
    registration.setInitParameters(params);

    registration.setLoadOnStartup(1);
    return registration;
}

//

@Override
protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
    return application.initializers(new MyApplicationContextInitializer()).sources(CityApp.class);
}

public static void main(final String... args) {
    new SpringApplicationBuilder(CityApp.class).initializers(new MyApplicationContextInitializer()).listeners().run(args);
}

}

The project structure is divided into two modules common and webapp

введите сюда описание изображения

Upvotes: 2

Views: 11405

Answers (3)

dangret
dangret

Reputation: 36

A bit old, but for the record, you can fix it quickly just adding next bean:

@Bean
public DispatcherServletRegistrationBean dispatcherServletRegistrationBean() {
    return new DispatcherServletRegistrationBean(dispatcherServlet(), "/");
}

Upvotes: 1

gunescelil
gunescelil

Reputation: 313

I am also searching for the answer. There is a migration guide from spring 1.5.x to 2.0. here Migration Guide

I think our solution is that. But I dont know how to implement their suggestion.

Upvotes: 0

kj007
kj007

Reputation: 6254

Servlet context path has been changed in 2.x

here are my recommendation which should work

  1. define servlet context path in application.properties.

     server.servlet.path=/ # Path of the main dispatcher servlet.
    
  2. make sure you have @Configuration notation on these configuration classes CityContextConfig.class, CityPersistenceJpaConfig.class, CityServiceConfig.class, CityWebConfig.class

     @SpringBootApplication
     public class CityApp {
    
    
     @Override
     protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
         return application.initializers(new MyApplicationContextInitializer()).sources(CityApp.class);
     }
    
        public static void main(final String... args) {
           new SpringApplicationBuilder(CityApp.class).initializers(new MyApplicationContextInitializer()).listeners().run(args);
        }
    
     }
    

Upvotes: 0

Related Questions