Kaspar Kaspar - 7 months ago 23
HTML Question

Spring not serving html file

So I am trying to follow this guide on how to serve html files with Spring:
http://spring.io/guides/gs/serving-web-content/

I have the exact same folder structure with exact same files but when I run the spring boot server, my

localhost:8080/greeting
will only show the string
greeting
that is returned from the
GreetingController
and that's it, if I look at the page source code, there is no html in it.

I could not find any related answers about this because all the similar answers still use the .xml file driven Spring where you declare the views in a .xml file. But this guide explicitly says that no .xml needs to be used. It should just work like that.

Mapping:

@RestController
public class GreetingController {

@RequestMapping("/greeting")
public String greeting(@RequestParam(value="name", required = false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}


Using @Controller throws error:

2015-02-25 14:50:14.830 ERROR 2378 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Circular view path [greeting]: would dispatch back to the current handler URL [/greeting] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)] with root cause

javax.servlet.ServletException: Circular view path [greeting]: would dispatch back to the current handler URL [/greeting] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)


EDIT:

Solution:
a) Use
@Controller
instead of
@RestController

b) When launching the application in IntelliJ, make sure you create a Gradle task that is ran before executing the Main class.

Answer

You are using @RestController (the documentation) instead of @Controller.

A convenience annotation that is itself annotated with @Controller and @ResponseBody.

And @ResponseBody just return to the caller whatever the method returns, string greeting in your case.

As for the Circular view path exception you are getting, it's probably related to ViewResolvers. From the spring boot docs

There are many implementations of ViewResolver to choose from, and Spring on its own is not opinionated about which ones you should use. Spring Boot, on the other hand, installs one or two for you depending on what it finds on the classpath and in the application context

So, there is probably something missing in the dependencies. Do you have spring-boot-starter-thymeleaf dependency configured?