"Нет доступных сообщений" с использованием 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"/>
Другие вопросы по тегам