"Нет доступных сообщений" с использованием Spring Boot/Thymeleaf
Я использую Spring Boot с Thymeleaf и пытаюсь получить доступ к простой веб-странице. У меня нет ошибок при сборке проекта. Только этот при доступе localhost:8080/greeting
:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Dec 02 15:36:04 CET 2016
There was an unexpected error (type=Not Found, status=404).
No message available
У меня есть контроллер:
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class UserController {
@RequestMapping("/greeting")
public String user(@RequestParam(value = "name", required = false, defaultValue = "World") String name, Model model){
model.addAttribute("name",name);
return "greeting";
}
}
Основное:
package boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main (String[] args){
SpringApplication.run(Application.class, args);
}
}
И веб-страница:
<!DOCTYPE html>
<html xmlns:th="http://www.themyleaf.org">
<head>
<meta charset="ISO-8859-1"/>
<title>SecondMaven</title>
</head>
<body>
<p th:text="'Hello, '+ ${name} + '!!!!!'" />
</body>
</html>
мой pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
Я понятия не имею, что не так с моим кодом. Я думаю, что это проблема конфигурации, но пока мне не повезло. Буду признателен за любую помощь, спасибо.
3 ответа
Давайте подробнее рассмотрим основную запись вашего приложения:
package boot;
^^^^^^^^^^^^^
// imports
@SpringBootApplication
public class Application { ... }
package boot
вместе с @SpringBootApplication
означает, что только компоненты в или ниже boot
Пакет будет отсканирован и зарегистрирован в контексте приложения. Вот как выглядит ваш контроллер:
package controller;
^^^^^^^^^^^^^^^^^^^
// imports
@Controller
public class UserController {
@RequestMapping("/greeting")
public String user(...) { ... }
}
Так как он находится в controller
пакет не может быть отсканирован @SpringBootApplication
следовательно, он не будет зарегистрирован и не будет обрабатывать запросы к /greeting
конечная точка.
Самое простое решение - переместить ваши контроллеры (и другие сканируемые компоненты) под boot
пакет, например boot.controller
в вашем конкретном случае.
В любом случае, Spring Boot не требует какой-либо конкретной компоновки кода для работы, однако есть некоторые рекомендации, которые могут помочь. Вы можете проверить эти лучшие практики здесь.
Попробуй это:
@Controller
public class UserController {
@RequestMapping("/greeting")
public ModelAndView user(@RequestParam(value = "name", required = false, defaultValue = "World") String name) {
return new ModelAndView("greeting").addObject("name", name);
}
}
Здесь у вас есть эквивалентный пример запуска.
Кажется, я вспоминаю о проблемах с самозакрывающимися тегами в моем ограниченном опыте работы с Thymeleaf. Попробуйте вручную закрыть элементы, например
<meta charset="ISO-8859-1"></meta>
вместо
<meta charset="ISO-8859-1"/>