2015-07-07 6 views
7

Я пытаюсь выполнить простой пример интеграции Spring Boot и FreeMarker (основанный на учебниках, которые я нашел в Интернете). По какой-то причине мое мнение не разрешается шаблону FreeMarker (я думаю, это проблема).Spring Boot и FreeMarker

Результат при запуске в браузере - это просто указать имя файла вида TFL, то есть «индекс». Таким образом, контроллер вызывается и возвращает строку «index», но, похоже, нет ни одного триггера для самого файла FTL. Любая помощь была бы оценена ...

У меня есть следующий класс конфигурации, где я определяю разрешение представления и конфигурацию 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; 
    } 
} 

Тогда я следующий контроллер:

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

Тогда, наконец, я следующий файл FTL хранится в "SRC/основные/ресурсы/шаблоны"

<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

Какой версии Spring ботинка вы используете? Вы видели, что Spring Boot поддерживает автоматическую настройку шаблонов Freemarker? Проверьте [this] (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-template-engines) и [это] (https: //github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java) – geoand

+0

Привет, я используя Spring Boot v1.2.5.RELEASE. Спасибо, сейчас я проверю ссылки. –

ответ

10

Проблема заключается в том что ваш контроллер имеет неправильную аннотацию. Вы должны использовать @Controller вместо @RestController

@RestController используется, чтобы сообщить, что ответ, отправленный с вашего контроллера, должен быть отправлен в браузер, как правило, объект, сопоставленный с json. Это то же самое, что и добавление @ResponseBody.

+0

Спасибо! это было ... изменилось сейчас и отлично работает. Хорошо подмечено. –

1

Хотя вы только что получили ответ. Однако ваш пост имеет два очка.

Во-первых, настройте шаблон Freemarker в Spring Boot довольно легко. Не нужно использовать WebMvcConfigurerAdapter. Вам просто нужно разместить свои свойства на вашем пути к классам с содержанием ниже

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

Во-вторых, @Controller используется для аннотированных классов как Spring MVC контроллер. @RestController аннотированные классы такие же, как @Controller, но @ResponseBody в методах обработчика подразумевается. Поэтому вы должны использовать @Controller в своем случае.

Нашел с поста Spring Boot FreeMarker Hello World Example

Смежные вопросы