2016-08-18 23 views
0

我試圖開發一個控制檯生成的JSF2結束Primefaces,它在Spring引導中的嵌入式tomcat上運行。這是我的項目配置:Spring引導嵌入tomcat - /pages/index.xhtml在ExternalContext中找不到作爲資源

的pom.xml

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.2.7.RELEASE</version> 
    <relativePath /> <!-- lookup parent from repository --> 
</parent> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <main.basedir>${basedir}/../..</main.basedir> 
    <java.version>1.8</java.version> 
    <tomcat.version>7.0.59</tomcat.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-juli</artifactId> 
     <version>${tomcat.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-jasper</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.googlecode.json-simple</groupId> 
     <artifactId>json-simple</artifactId> 
     <version>1.1.1</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jsp-api</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.el</groupId> 
     <artifactId>el-ri</artifactId> 
     <version>1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-api</artifactId> 
     <version>2.2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.14</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-impl</artifactId> 
     <version>2.2.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.5</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.5</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.primefaces</groupId> 
     <artifactId>primefaces</artifactId> 
     <version>6.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.python</groupId> 
     <artifactId>jython-standalone</artifactId> 
     <version>2.7.1b3</version> 
    </dependency> 
</dependencies> 

<build> 
    <finalName>ConfigurationConsole</finalName> 
    <outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

faces-config.xml中

<application> 
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

的web.xml

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/fases/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/javax.faces.resource/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 
<context-param> 
    <description> 
     If comments are enabled, the copyright header will prevent the login form 
     from working on Internet Explorer. Alternatively, you can remove the copyright 
     header. 
    </description> 
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> 
    <param-value>true</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
    <param-value>resources.application</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> 
    <param-value>com.igt.icc.configurationConsole.FaceletsResourceResolver</param-value> 
</context-param> 
<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 
<session-config> 
    <session-timeout>30</session-timeout> 
</session-config> 

春季啓動主類:

@SpringBootApplication 
@EnableAutoConfiguration 
@ComponentScan 
public class ApplicationStarter extends SpringBootServletInitializer implements ServletContextAware 
{ 

/** 
* 
* @param args 
*/ 
public static void main(String[] args) { 
    SpringApplication.run(ApplicationStarter.class, args); 
    try{ 
     //JSONPropertiesManager.getInstance().loadProperties(); 
     JSONPropertiesManager.getInstance().loadJSONProperties(); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(ApplicationStarter.class); 
} 


@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<ConfigureListener> jsfConfigureListener() { 
    return new ServletListenerRegistrationBean<ConfigureListener>(
     new ConfigureListener()); 
} 

@Override 
public void setServletContext(ServletContext servletContext) { 
    servletContext.setInitParameter("com.sun.faces.forceLoadConfiguration", Boolean.TRUE.toString());  
} 

}

facesResourceResolver類,叫入web.xml中:

public class FaceletsResourceResolver extends ResourceResolver { 

private ResourceResolver parent; 
private String basePath; 

public FaceletsResourceResolver(ResourceResolver parent) { 
    this.parent = parent; 
    this.basePath = "/META-INF/"; // TODO: Make configureable? 
} 

@Override 
public URL resolveUrl(String path) { 
    URL url = parent.resolveUrl(path); // Resolves from WAR. 

    if (url == null) { 
     url = getClass().getResource(basePath + path); // Resolves from JAR. 
    } 

    return url; 
} 

,這是我的項目結構:

projectFolder 


-src 
     -main 
      -java 
      -resources 
       - here i have copyed into META-INF the *.class and /pages/*.xhtml 
      -webapp 

在Netbeans和日食正確運行的應用程序。但是,當我建立它,並嘗試啓動jar應用程序啓動正確,但是當我嘗試打開頁面我收到404沒有找到,我做錯了什麼?

+0

您的'web.xml'不執行任何操作。另外,如果我記得正確JSF和Spring Boot只適用於戰爭文件。除此之外,您可能想嘗試[this](https://github.com/joinfaces/joinfaces),而不是自動配置和引導JSF。 –

+0

頁面應該位於webapp – Jens

+0

Jens ---用於springboot的jar paxkajing webapp文件夾將不會被包含到app.jar中,因此您需要複製文件unde資源文件夾或將webapp文件夾作爲資源目錄添加到構建中pom的部分。 – liberosoftware

回答

1



請如示於下圖中遵循此以下文件夾結構。

FolderStructure

+0

這正是我的結構...唯一的區別是,我有所有文件夾bootstrap,CSS等...直接在webapp下,而不是在webapp/resources下... – liberosoftware

+0

請在資源下移動,當你公開作爲戰爭文件時,spring-boot將查找資源文件夾並讓其知道。 –

+0

同樣的問題... /pages/index.xhtml在ExternalContext中找不到作爲資源 – liberosoftware

相關問題