@giksen

Java Spring MVC не видит представления, почему (Inteliji Idea)?

Занимался Spring Framework по видеороликам этого канала https://www.youtube.com/channel/UCK5d3n3kfkzlArMcc.... Первые 14 занятий прошли замечательно и никаких проблем, которые я не мог бы исправить, не возникало. На 15-16 занятии разбиралось создание MVC проекта двумя методами (конфигурация через xml файл и через джава класс). Уже на 15 занятии возникли проблемы. Я делал все точно так же , как и преподаватель, но у меня возникали ошибки ,которых в видео не было (ошибки , связанные с slf4j ).Вроде как эту проблему я решил, но при запуске проекта у меня открывается не то представление, которое я указывал для открытия. 2 Дня пытаюсь решить эту проблему, но никак не получается. Когда я удалил файл index.jsp (файл, который открывается вместо того, что я указывал ), стала появляется страница , сообщающая об ошибке 404. Те же самые проблемы возникли и в ходе 16 занятия.

Я залил код на гитхаб , надеюсь на помощь.
https://github.com/Giksengik/spring/tree/main/MVC/...

Класс Конфигураций:
package ru.vlasov.MVCFirstApp.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;


@Configuration
@ComponentScan(basePackages = "ru.vlasov.MVCFirstApp")
@EnableWebMvc
public class SpringConfig implements WebMvcConfigurer {

    private final ApplicationContext applicationContext;

    @Autowired
    public SpringConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        registry.viewResolver(resolver);
    }
}


Класс MVCDispatcher
package ru.vlasov.MVCFirstApp.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MySpringMvcDispatcherSerlvetIntitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}


Класс Контроллера
package ru.vlasov.MVCFirstApp;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class HelloController {
    @GetMapping("/hello-world")
    public String sayHello() {
        return "hello_world";
    }
}


Конфигурация log4j
# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=D:/temp4/log4j-application.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
  • Вопрос задан
  • 2261 просмотр
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Приветствую, коллега!
Я посмотрел ваш репозиторий и могу предположить следующие причины того, почему вам не удается использовать thymeleaf.
1) У вас 2 модуля и оба модуля являются war. Соответственно, можно предположить, что вы запускаете первый модуль (firstapp), вместо второго (MVCFirstApp). А шаблонизатор thymeleaf у вас подключен во втором модуле.
Таким образом вам нужно запустить второй модуль через Tomcat. А также рекомендую прочитать про модули maven, чтобы понять как они устроены и как работают. Например, в родительском pom.xml нужно указать packaging - pom, для модулей, которые являются библиотекой - jar, ну и для основного модуля, который содержит файлы запуска приложения - указать war или jar в зависимости от того, что вам нужно.

2) Вторая причина того, почему вы не можете открыть страницу может заключаться в контроллере. Возможно, что вы пытаетесь открыть шаблон через базовый URL (/), а метод, для которого назначен шаблон - /hello-world
Сниппет вашего кода?:
@Controller
@RequestMapping("/")
public class HelloController {

    @GetMapping("/hello-world")
    public String sayHello() {
        return "hello_world";
    }
}


Таким образом, исходя из текущего проекта, вам достаточно запустить второй модуль через томкат и открыть урл /hello-world, чтобы открыть нужный шаблон
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы