2015-07-07 17 views
7

Sto provando a lavorare su un semplice esempio di Spring Boot e integrazione con FreeMarker (basato su tutorial che ho trovato sul web). Per qualche ragione la mia vista non è stata risolta nel modello di FreeMarker (penso che sia il problema).Spring Boot e FreeMarker

Il risultato quando viene lanciato in un browser è semplicemente per restituire il nome del file di visualizzazione TFL, ad esempio "indice". Quindi il controller viene chiamato e restituisce la stringa "index", ma sembra che non ci sia alcun trigger per estrarre il file FTL stesso. Qualsiasi aiuto sarebbe apprezzato ...

Ho la seguente classe di configurazione in cui definisco il resolver di visualizzazione e la configurazione di 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; 
    } 
} 

Poi ho il seguente 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"; 
    } 
} 

Poi finalmente ho il seguente file FTL memorizzato in "src/main/risorse/templates"

<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

Quale versione di primavera Boot stai usando? Hai visto che l'avvio automatico di Spring Boot supporta la configurazione dei modelli Freemarker? Dai un'occhiata a [questo] (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-template-engines) e [this] (https: //github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java) – geoand

+0

Ciao, sono utilizzando Spring Boot v1.2.5.RELEASE. Grazie, controllerò i link ora. –

risposta

10

Il problema è che il tuo controller ha l'annotazione sbagliata. Dovresti usare @Controller invece di @RestController

@RestController viene utilizzato per indicare che la risposta inviata dal controller deve essere inviata al browser, di solito un oggetto mappato a json. È lo stesso che aggiungere @ResponseBody.

+0

Grazie! era ... cambiato ora e funzionava bene. Ben individuato. –

1

Anche se hai appena ricevuto la risposta. Tuttavia, il tuo post ha due punti.

Innanzitutto, configurare il modello di Freemarker in Spring Boot è abbastanza semplice. Non è necessario utilizzare WebMvcConfigurerAdapter. Hai solo bisogno di inserire il vostro proprietà sul vostro cammino classe con il seguente contenuto

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

In secondo luogo, @Controller viene utilizzato per le classi annotate come Spring MVC Controller. Le classi annotate @RestController sono le stesse di @Controller ma i metodi @ResponseBody sui gestori sono impliciti. Quindi devi usare @Controller nel tuo caso.

trovato questo dalla carica Spring Boot FreeMarker Hello World Example