【问题标题】:Spring boot embed tomcat - /pages/index.xhtml Not Found in ExternalContext as a ResourceSpring Boot嵌入tomcat - /pages/index.xhtml在ExternalContext中找不到作为资源
【发布时间】:2016-12-25 02:01:19
【问题描述】:

我正在尝试开发一个控制台制作的 JSF2 端 Primefaces,它在 Spring Boot 中的嵌入式 tomcat 上运行。这是我的项目配置:

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>

Spring boot 主类:

@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 和 Eclipse 中,应用程序运行正常。但是当我构建它并尝试启动 jar 应用程序正确启动但是当我尝试打开页面时我收到 404 未找到,我做错了什么?

【问题讨论】:

  • 您的web.xml 没有任何作用。另外,如果我没记错的话,JSF 和 Spring Boot 仅适用于战争文件。除此之外,您可能想尝试this,而不是破解您自己的代码,而不是为您自动配置和引导 JSF。
  • 页面应该在 webapp 下
  • Jens --- 使用用于 springboot 的 jar paxkajing webapp 文件夹将不会包含在 app.jar 中,因此您需要将文件复制到资源文件夹或将 webapp 文件夹作为资源目录添加到构建 pom 的部分。
  • 这个 PrimeFaces 有什么关系?如果您不使用 PrimeFaces,它是否有效?
  • Primefaces 仅用于一页中的组件。我试图删除它,但仍然得到同样的错误

标签: jsf tomcat primefaces spring-boot


【解决方案1】:

解决方案

请按照下面的文件夹结构如下图所示。

【讨论】:

  • 这正是我的结构...唯一的区别是我有所有文件夹 bootstrap、css 等...直接在 webapp 下而不是在 webapp/resources...
  • 请移到resources下,当你暴露为war文件时,spring-boot会查找resources文件夹并告知。
  • 同样的问题... /pages/index.xhtml 在 ExternalContext 中找不到作为资源
  • 好的,伙计们,我已经解决了......正如 Praveen Spring boot 所说,寻找资源文件夹,但是当你构建 jar 时,必须将资源文件夹复制到 META-INF 文件夹下。跨度>
猜你喜欢
  • 2016-02-10
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2021-06-02
  • 2017-08-11
  • 2012-10-20
相关资源
最近更新 更多