title: Spring Boot and JSF/Primefaces/Richfaces
body: <p>I have been in contact with Spring for just a few months now and recently came upon Spring Boot while browsing the guides section. The guides were very easy to complete and made for a good initial grasp of the projects's basic (and awesome) idea, which is to be able to build and deploy enterprise-level applications with minimal configuration while upholding to a wide array of Spring's/JEE's good practices. I am really interested in using Spring Boot for test projects since with it they are so much easier and faster to set up and run and still be very close to my production environment.
  I am currently trying to build a project with Spring Boot and Primefaces as my view technology of choice, but this setup apparently isn't ready out-of-the-box as is the case with Thymeleaf, for which having its binary in the classpath is enough. I tried including the folowing gradle/maven artifacts, with no success:</p>
  
  <ul>
  <li>primefaces</li>
  <li>jsf-api</li>
  <li>jsf-impl</li>
  <li>el-api</li>
  </ul>
  
  <p>Spring Boot's embedded Tomcat server starts with no apparent errors, but after trying to open a page such as /view in a browser, the embedded server displays the following error message: <code>HTTP Status 500 - Circular view path: would dispatch back to the current handler URL again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)</code></p>
  
  <p>After searching in several different places, I still fail to locate any resources/tutorials on how to set up such a project.
  Here are the contents of my build.gradle file:</p>
  
  <pre><code>buildscript {
      repositories {
          maven { url "http://repo.spring.io/libs-snapshot" }
      }
      dependencies {
          classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC4")
      }
  }
  
  apply plugin: 'java'
  apply plugin: 'idea'
  apply plugin: 'spring-boot'
  
  idea {
      module {
          downloadJavadoc = true
      }
  }
  
  group = 'com.hello'
  version = '0.0.1-SNAPSHOT'
  
  repositories {
      mavenCentral()
      mavenLocal()
      maven { url "http://repository.primefaces.org" }
  }
  
  dependencies {
      compile("org.springframework.boot:spring-boot-starter-web")
  //    compile ("org.thymeleaf:thymeleaf-spring4")
      compile group: 'org.primefaces', name: 'primefaces', version: '4.0'
  
      compile group: 'com.sun.faces', name: 'jsf-api', version: '2.2.2'
      compile group: 'com.sun.faces', name: 'jsf-impl', version: '2.2.2'
      compile group: 'javax.el', name: 'el-api', version: '1.0'
  }
  
  task wrapper(type: Wrapper) {
      gradleVersion=1.10
  }
  </code></pre>
  
  <p>My main class:</p>
  
  <pre><code>package com.hello;
  
  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.context.annotation.Configuration;
  
  @EnableAutoConfiguration
  @ComponentScan
  @Configuration
  public class Application {
      public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
      }
  }
  </code></pre>
  
  <p>and my implementation of WebMvcConfigurerAdapter:</p>
  
  <pre><code>package com.hello;
  
  import org.springframework.context.annotation.Configuration;
  import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
  import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  
  @Configuration
  public class MvcConfig extends WebMvcConfigurerAdapter {
  
      @Override
      public void addViewControllers(ViewControllerRegistry registry) {
          registry.addViewController("/").setViewName("view");
          registry.addViewController("/view").setViewName("view");
      }
  
  }
  </code></pre>
  
  <p>Along with my view.html file (I also tried view.xhtml), these are all the files I created for this project as I'm trying for the minimal setup.</p>
  
  <p>If anyone can see what I'm doing wrong (or not doing at all), help would be much appreciated.
  Do I need extra files/beans for JSF configuration in this case? If so, where and how should put such files?</p>
  
  <p>This question has also been posted in the official Spring forums:
  <a href="http://forum.spring.io/forum/spring-projects/boot/746552-spring-boot-and-jsf-primefaces-richfaces">http://forum.spring.io/forum/spring-projects/boot/746552-spring-boot-and-jsf-primefaces-richfaces</a></p>
  
  <hr>
  
  <p>EDIT: 
  After including M. Deinum's configuration bean for JSF and removing the WebMvcConfigurerAdapter definition (related to Spring MVC), Spring Boot seems to map requests to the FacesServlet instance, now I get the following error message:
      <code>HTTP Status 500 - Servlet.init() for servlet FacesServlet threw exception</code></p>
  
  root cause:
  
  <pre><code>java.lang.IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory
  </code></pre>
  
  <p>The code for the new JsfConfig bean:</p>
  
  <pre><code>package com.hello;
  
  import com.sun.faces.config.ConfigureListener;
  import org.springframework.boot.context.embedded.ServletListenerRegistrationBean;
  import org.springframework.boot.context.embedded.ServletRegistrationBean;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.web.servlet.ViewResolver;
  import org.springframework.web.servlet.view.InternalResourceViewResolver;
  
  import javax.faces.webapp.FacesServlet;
  
  @Configuration
  public class JsfConfig {
  
      @Bean
      public FacesServlet facesServlet() {
          return new FacesServlet();
      }
  
      @Bean
      public ServletRegistrationBean facesServletRegistration() {
          ServletRegistrationBean registration = new ServletRegistrationBean(facesServlet(), "*.xhtml");
          registration.setName("FacesServlet");
          return registration;
      }
  
      @Bean
      public ServletListenerRegistrationBean&lt;ConfigureListener&gt; jsfConfigureListener() {
          return new ServletListenerRegistrationBean&lt;ConfigureListener&gt;(new ConfigureListener());
      }
  
      @Bean
      public ViewResolver getViewResolver(){
          InternalResourceViewResolver resolver = new InternalResourceViewResolver();
          resolver.setPrefix("/templates/");
          resolver.setSuffix(".xhtml");
          return resolver;
      }
  }
  </code></pre>