2015-07-07 36 views
7

Próbuję rozwiązać prosty przykład integracji Spring Boot i FreeMarker (na podstawie samouczków znalezionych w Internecie). Z jakiegoś powodu mój widok nie jest rozwiązany w szablonie FreeMarker (myślę, że to jest problem).Spring Boot i FreeMarker

Wynik po uruchomieniu w przeglądarce polega po prostu na zwrocie nazwy pliku widoku TFL, tj. "Indeksu". W związku z tym kontroler jest wywoływany i zwraca ciąg znaków "index", ale wydaje się, że nie ma żadnego mechanizmu uruchamiającego sam plik FTL. Każda pomoc byłaby doceniana ...

Mam następującą klasę konfiguracji, w której definiuję resolwera widoku i konfigurację Free Maker.

@Configuration 
public class MvcConfigurer extends WebMvcConfigurerAdapter { 
    @Bean 
    public ViewResolver viewResolver() { 
     FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); 
     resolver.setCache(true); 
     resolver.setPrefix(""); 
     resolver.setSuffix(".ftl"); 
     resolver.setContentType("text/html; charset=UTF-8"); 
     return resolver; 
    } 

    @Bean 
    public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException { 
     FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory(); 
     factory.setTemplateLoaderPaths("classpath:templates", "src/main/resource/templates"); 
     factory.setDefaultEncoding("UTF-8"); 
     FreeMarkerConfigurer result = new FreeMarkerConfigurer(); 
     result.setConfiguration(factory.createConfiguration()); 
     return result; 
    } 
} 

Następnie Mam następujący sterownik:

@RestController 
public class HelloController { 

    /** 
    * Static list of users to simulate Database 
    */ 
    private static List<User> userList = new ArrayList<User>(); 

    //Initialize the list with some data for index screen 
    static { 
     userList.add(new User("Bill", "Gates")); 
     userList.add(new User("Steve", "Jobs")); 
     userList.add(new User("Larry", "Page")); 
     userList.add(new User("Sergey", "Brin")); 
     userList.add(new User("Larry", "Ellison")); 
    } 

    /** 
    * Saves the static list of users in model and renders it 
    * via freemarker template. 
    * 
    * @param model 
    * @return The index view (FTL) 
    */ 
    @RequestMapping(value = "/index", method = RequestMethod.GET) 
    public String index(@ModelAttribute("model") ModelMap model) { 

     model.addAttribute("userList", userList); 

     return "index"; 
    } 

    /** 
    * Add a new user into static user lists and display the 
    * same into FTL via redirect 
    * 
    * @param user 
    * @return Redirect to /index page to display user list 
    */ 
    @RequestMapping(value = "/add", method = RequestMethod.POST) 
    public String add(@ModelAttribute("user") User user) { 

     if (null != user && null != user.getFirstname() 
       && null != user.getLastname() && !user.getFirstname().isEmpty() 
       && !user.getLastname().isEmpty()) { 

      synchronized (userList) { 
       userList.add(user); 
      } 
     } 
     return "redirect:index.html"; 
    } 
} 

wreszcie mam następujący plik FTL przechowywane w "src/main/zasobów/szablonów"

<html> 
<head><title>ViralPatel.net - FreeMarker Spring MVC Hello World</title> 
<body> 
<div id="header"> 
<H2> 
    <a href="http://viralpatel.net"><img height="37" width="236" border="0px" src="http://viralpatel.net/blogs/wp-content/themes/vp/images/logo.png" align="left"/></a> 
    FreeMarker Spring MVC Hello World 
</H2> 
</div> 

<div id="content"> 

    <fieldset> 
    <legend>Add User</legend> 
    <form name="user" action="add.html" method="post"> 
    Firstname: <input type="text" name="firstname" /> <br/> 
    Lastname: <input type="text" name="lastname" /> <br/> 
    <input type="submit" value=" Save " /> 
    </form> 
    </fieldset> 
    <br/> 
    <table class="datatable"> 
    <tr> 
     <th>Firstname</th> <th>Lastname</th> 
    </tr> 
    <#list model["userList"] as user> 
    <tr> 
     <td>${user.firstname}</td> <td>${user.lastname}</td> 
    </tr> 
    </#list> 
    </table> 

</div> 
</body> 
</html> 
+1

Jaka wersja wiosennym Boot używasz? Czy widziałeś automatyczną konfigurację Spring Boot do szablonów Freemarker? Sprawdź [to] (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-template-engines) i [to] (https: //github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java) – geoand

+0

Cześć, jestem przy użyciu Spring Boot v1.2.5.RELEASE. Dzięki, sprawdzę teraz linki. –

Odpowiedz

10

Problemem jest to, że twój kontroler ma niewłaściwą adnotację. Powinieneś użyć @Controller zamiast @RestController

@RestController służy do stwierdzenia, że ​​odpowiedź wysłana z kontrolera powinna zostać wysłana do przeglądarki, zwykle obiekt odwzorowany na json. Jest to to samo, co dodanie @ResponseBody.

+0

Dzięki! to było ... teraz zmienione i działa dobrze. Dobrze zauważony. –

1

Chociaż właśnie dostałeś odpowiedź. Twój post ma jednak dwa punkty.

Po pierwsze, skonfiguruj szablon Freemarker w Spring Boot całkiem łatwo. Nie trzeba używać WebMvcConfigurerAdapter. Wystarczy umieścić swoje właściwości na ścieżce klasy z zawartością poniżej

spring.freemarker.template-loader-path: /templates 
spring.freemarker.suffix: .ftl 

drugie, @Controller służy do adnotacjami klas jak wiosennym MVC Controller. Klasy oznaczone adnotacją @RestController są takie same, jak @Controller, ale domniemanie @ResponseBody w metodach obsługi jest domyślne. Więc musisz użyć @Controller w twoim przypadku.

Znaleziony to ze stanowiska Spring Boot FreeMarker Hello World Example