Spring Boot, Java Config - не найдено сопоставление для HTTP-запроса с URI [/] в DispatcherServlet с именем 'dispatcherServlet'

Это довольно распространенная проблема здесь, в stackOverflow, но ни одна из тем, связанных с той же проблемой, не решает мою.

У нас есть конфигурация шаблона, в которой используется конфигурация xml, но теперь мы пытаемся отойти от нее и начать использовать конфигурацию Java.

Итак, у меня есть новый проект, использующий конфигурацию Java и Spring Boot. Мы также используем JSP и Tiles 3.

Проблема в том, что не удается отобразить страницу входа в систему администратора.

Вот код:

Основной класс конфигурации:

@SpringBootApplication
@EnableScheduling
@Import(OnAdminBeans.class)
public class AppConfig extends SpringBootServletInitializer {

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

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

AppConfig.class - это основной пакет. Через @ComponentScan, который приносит @SpringBootApplication, он сканирует другие конфигурации, которые есть на mainpackage.config, поэтому он импортирует класс конфигурации представления:

@Configuration
@EnableWebMvc
public class ViewConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/adm/static/**").addResourceLocations("/adm/static/");
    }

//  @Override
//  public void addViewControllers(ViewControllerRegistry registry) {
//      registry.addViewController("/adm/login").setViewName("login-template-tiles");
//  }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.viewResolver(viewResolver());
        registry.viewResolver(jspViewResolver());
        registry.viewResolver(tilesViewResolver());
    }

    @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver localeResolver = new CookieLocaleResolver();
        localeResolver.setCookieName("locale");
        localeResolver.setCookieMaxAge(30);
        localeResolver.setDefaultLocale(new Locale("pt", "BR"));
        return localeResolver;
    }

    @Bean
    public MultipleViewResolver viewResolver() {
        Map<String, ViewResolver> viewsResolvers = new HashMap<String, ViewResolver>();
        viewsResolvers.put(MultipleViewResolver.ViewType.JSP.getKey(), jspViewResolver());
        viewsResolvers.put(MultipleViewResolver.ViewType.TILES.getKey(), tilesViewResolver());

        MultipleViewResolver viewResolver = new MultipleViewResolver();
        viewResolver.setViewsResolvers(viewsResolvers);
        viewResolver.setOrder(1);
        return viewResolver;
    }

    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setOrder(2);
        return viewResolver;
    }

    @Bean
    public UrlBasedViewResolver tilesViewResolver() {
        UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
        viewResolver.setViewClass(TilesView.class);
        viewResolver.setOrder(3);
        return viewResolver;
    }

    @Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer configurer = new TilesConfigurer();
        configurer.setDefinitions("/WEB-INF/tile-defs/tiles-definitions.xml");
        return configurer;
    }
}

LoginController.class определяется как:

@Controller
@RequestMapping(value = "/adm")
public class LoginController {

    @RequestMapping(value = "/login")
    public ModelAndView login() {
        return new ModelAndView("login-template-tiles");
    }
}

И в tiles-definitions.xml у меня есть следующее определение плиток-шаблонов входа:

<definition name="login-template-tiles" template="/WEB-INF/jsp/adm/templates/login-template.jsp">
        <put-attribute name="admin-title" value="Admin" />
        <put-attribute name="content" value="/WEB-INF/jsp/adm/templates/sections/login/index.jsp" />
    </definition>

Обратите внимание, что оба файла существуют.

Учитывая все, что LoginController.login () действительно вызывается, когда я пытаюсь получить доступ к / adm / login. Но, по-видимому, он не может найти правильный файл jsp.

Возвращает 404. При включенной TRACE я получаю следующий журнал:

DispatcherServlet with name 'dispatcherServlet' processing GET request for [/WEB-INF/jsp/adm/templates/login-template.jsp]

Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@2118c09a] in DispatcherServlet with name 'dispatcherServlet'

Looking up handler method for path /WEB-INF/jsp/adm/templates/login-template.jsp

Did not find handler method for [/WEB-INF/jsp/adm/templates/login-template.jsp]

Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@2c148974] in DispatcherServlet with name 'dispatcherServlet'

No handler mapping found for [/WEB-INF/jsp/adm/templates/login-template.jsp]

Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@784c3547] in DispatcherServlet with name 'dispatcherServlet'

No handler mapping found for [/WEB-INF/jsp/adm/templates/login-template.jsp]

Testing handler map [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@533e0604] in DispatcherServlet with name 'dispatcherServlet'

Testing handler map [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@cfd1b4e] in DispatcherServlet with name 'dispatcherServlet'

No mapping found for HTTP request with URI [/WEB-INF/jsp/adm/templates/login-template.jsp] in DispatcherServlet with name 'dispatcherServlet'

Любые предложения приветствуются!

РЕДАКТИРОВАТЬ: Хорошо. Путем отладки я обнаружил, что это как-то связано со встроенным Tomcat. Кроме этого, я понятия не имею, что происходит.

ИЗМЕНИТЬ 2:

Обнаружено, что проблема в org.springframework.web.servlet.DispatcherServlet # getHandler. Он просто не находит HandlerMapping для этого запроса. Я должен зарегистрировать один?


person Glauber Néspoli    schedule 22.05.2015    source источник


Ответы (3)


В ПОРЯДКЕ! Нашел проблему.

Мне помогла эта ссылка: https://samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-java-based-config/

Более конкретно эта конфигурация:

@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

Установив обработчик по умолчанию, я бы больше не получал белую страницу, а вместо этого получал бы код JSP в виде html, который ясно говорит мне, что JSP был найден, но не обработан.

Итак, ответ был на этой странице: JSP-файл не отображается в Spring Загрузите веб-приложение

Мне не хватало артефакта tomcat-embed-jasper.

person Glauber Néspoli    schedule 28.05.2015
comment
это помогло мне продолжить :) - person Krishna; 20.09.2015

Добавьте ниже зависимость к вашему pom.xml

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
person Bheeman    schedule 27.12.2016
comment
Я столкнулся с той же проблемой, добавил tomcat-embed-jasper в pom.xml, но перенаправлял страницу ошибок по умолчанию. Я попытался добавить bean-компонент InteralResourceViewResolver, и это сработало. - person Bheeman; 27.12.2016

Приведенные здесь советы помогли мне, когда я столкнулся с подобной проблемой. Я исправил это после добавления этого фрагмента в свою конфигурацию

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}
person Venki Ram    schedule 21.06.2018