2015-07-07 16 views
7

Ich versuche, ein einfaches Beispiel für Spring Boot und FreeMarker Integration (basierend auf Tutorials, die ich im Internet gefunden habe) zu arbeiten. Aus irgendeinem Grund wird meine Ansicht nicht in das FreeMarker-Template aufgelöst (ich denke, das ist das Problem).Spring Boot und FreeMarker

Das Ergebnis, wenn in einem Browser gestartet wird, ist einfach den Namen der TFL-View-Datei, d. H. "Index". Also wird der Controller aufgerufen und gibt den String "index" zurück, aber es scheint keinen Trigger zu geben, der die FTL-Datei selbst einliest. Jede mögliche Hilfe würde geschätzt werden ...

Ich habe die folgende Konfigurationsklasse, in der ich den Ansichtsresolver und die freie Herstellerkonfiguration definiere.

@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; 
    } 
} 

Dann habe ich die folgenden Controller:

@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"; 
    } 
} 

Dann endlich habe ich die folgende FTL-Datei in "src/main/resource/Vorlagen" gespeichert

<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

Welche Version von Spring-Boot verwenden Sie? Haben Sie gesehen, dass Spring Boot automatische Konfiguration für Freemarker Templates unterstützt? Schauen Sie sich [this] (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-template-engines) und [this] an (https: //github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java) – geoand

+0

Hallo, bin ich Verwenden von Spring Boot v1.2.5.RELEASE. Danke, ich überprüfe jetzt die Links. –

Antwort

10

Das Problem ist, dass Ihr Controller die falsche Anmerkung hat. Sie sollten @Controller anstelle von @RestController verwenden

@RestController wird verwendet, um zu sagen, dass die Antwort von Ihrem Controller an den Browser gesendet werden sollte, in der Regel ein Objekt, das json zugeordnet ist. Dies entspricht dem Hinzufügen von @ResponseBody.

+0

Danke! Das war es ... hat sich jetzt geändert und funktioniert gut. Gut beobachtet. –

1

Obwohl Sie gerade die Antwort bekommen haben. Ihr Post hat jedoch zwei Punkte.

Erstens, Freemarker Vorlage in Spring Boot ziemlich einfach zu konfigurieren. Keine Notwendigkeit, WebMvcConfigurerAdapter zu verwenden. Sie müssen nur Ihre Eigenschaften auf Ihrem Classpath unter

mit dem Inhalt platzieren
spring.freemarker.template-loader-path: /templates 
spring.freemarker.suffix: .ftl 

Zweitens wird @Controller zu kommentierten Klassen wie Spring MVC-Controller verwendet. @RestController annotierte Klassen sind die gleichen wie @Controller, aber die @ResponseBody für die Handler-Methoden sind impliziert. Sie müssen @Controller in Ihrem Fall verwenden.

Fand dieses von der Post Spring Boot FreeMarker Hello World Example