IBM BlueMix |添加 jsf 时:未找到此请求的应用程序或上下文根:./?
IBM BlueMix | While adding jsf : The application or context root for this request has not been found: ./?
我在 IBM Bluemix 上有一个简单的 JSF 应用程序 运行,可以很好地处理以下 J2EE 依赖项。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
用 JSF 依赖项替换它时
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.2</version>
</dependency>
我收到以下错误
未找到此请求的应用程序或上下文根:/
有什么帮助吗?
我的Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Java DB Web Starter</display-name>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</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>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<persistence-context-ref>
<persistence-context-ref-name>openjpa-todo/entitymanager</persistence-context-ref-name>
<persistence-unit-name>openjpa-todo</persistence-unit-name>
</persistence-context-ref>
<resource-ref>
<!-- The cloudAutowiring-1.0 Liberty feature will resolve this to whatever
the database service name is -->
<!-- When running locally without this feature, create a datasource with
the JNDI name "jdbc/mydbdatasource" in server.xml -->
<!-- If using MySQL locally then use the "url" property and append "?relaxAutoCommit=true", for example:
<dataSource id='mysql-datasource' jdbcDriverRef='mysql-driver' jndiName='jdbc/mydbdatasource'>
<properties user='root' password='password' url="jdbc:mysql://localhost:3306/db?relaxAutoCommit=true"/>
</dataSource> -->
<res-ref-name>jdbc/mydbdatasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
检查您的 web.xml 您应该使用
调用您的应用程序
https://[your_application_URL]/faces/
而不是
https://[your_application_URL]/
因为 Faces Servlet 正在根据
侦听此路径
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
与 jax-rs 网络服务根据
在 /api 路径上侦听的方式相同
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
聊完问题编辑:
问题出在所使用的 jsf 依赖项上,这使得应用程序使用包含 java 包 com.sun.faces 下的 类 的 jsf-impl-xxx.jar,而不是javax.faces包下的类加载jsf-api-xxx.jar(使用j2ee-web-api依赖时使用)
最后一个 jar 中的 类 是 JSF 规范定义的标准 API 的实现。
如果您只想添加 JSF 的依赖项而不想带走整个 j2ee-web-api,您可以使用工件
jsf-api-xxx 作为依赖
它将解决您的问题
我找到了答案Here
简要:
如果您使用的是 Maven,您可以在下面找到必要的坐标:
Java EE 容器(WildFly、JBoss、TomEE、Payara、GlassFish、WebSphere 等)
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version><!-- 7.0 (JSF 2.2) or 6.0 (JSF 2.0/2.1) --></version>
<scope>provided</scope>
</dependency>
请注意 Java EE 版本必须与服务器自己的 Java EE 版本相匹配。在面向 Java EE 6 服务器时不能将其设置为 7.0。
Servlet 容器(Tomcat、Jetty 等)
莫哈拉
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>// jsf-imp and jsf-api were been mereged into one jar
<version><!-- Check http://javaserverfaces.java.net --></version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
您还可以检查 org.glassfish:javax.faces 存储库以获取当前最新的 Mojarra 发布版本(截至目前为 2.2.13)。
我的脸
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-api</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-impl</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
我在 IBM Bluemix 上有一个简单的 JSF 应用程序 运行,可以很好地处理以下 J2EE 依赖项。
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
用 JSF 依赖项替换它时
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.2</version>
</dependency>
我收到以下错误
未找到此请求的应用程序或上下文根:/
有什么帮助吗?
我的Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Java DB Web Starter</display-name>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</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>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<persistence-context-ref>
<persistence-context-ref-name>openjpa-todo/entitymanager</persistence-context-ref-name>
<persistence-unit-name>openjpa-todo</persistence-unit-name>
</persistence-context-ref>
<resource-ref>
<!-- The cloudAutowiring-1.0 Liberty feature will resolve this to whatever
the database service name is -->
<!-- When running locally without this feature, create a datasource with
the JNDI name "jdbc/mydbdatasource" in server.xml -->
<!-- If using MySQL locally then use the "url" property and append "?relaxAutoCommit=true", for example:
<dataSource id='mysql-datasource' jdbcDriverRef='mysql-driver' jndiName='jdbc/mydbdatasource'>
<properties user='root' password='password' url="jdbc:mysql://localhost:3306/db?relaxAutoCommit=true"/>
</dataSource> -->
<res-ref-name>jdbc/mydbdatasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
检查您的 web.xml 您应该使用
调用您的应用程序https://[your_application_URL]/faces/
而不是
https://[your_application_URL]/
因为 Faces Servlet 正在根据
侦听此路径<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
与 jax-rs 网络服务根据
在 /api 路径上侦听的方式相同<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
聊完问题编辑:
问题出在所使用的 jsf 依赖项上,这使得应用程序使用包含 java 包 com.sun.faces 下的 类 的 jsf-impl-xxx.jar,而不是javax.faces包下的类加载jsf-api-xxx.jar(使用j2ee-web-api依赖时使用) 最后一个 jar 中的 类 是 JSF 规范定义的标准 API 的实现。
如果您只想添加 JSF 的依赖项而不想带走整个 j2ee-web-api,您可以使用工件 jsf-api-xxx 作为依赖
它将解决您的问题
我找到了答案Here
简要:
如果您使用的是 Maven,您可以在下面找到必要的坐标:
Java EE 容器(WildFly、JBoss、TomEE、Payara、GlassFish、WebSphere 等)
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version><!-- 7.0 (JSF 2.2) or 6.0 (JSF 2.0/2.1) --></version>
<scope>provided</scope>
</dependency>
请注意 Java EE 版本必须与服务器自己的 Java EE 版本相匹配。在面向 Java EE 6 服务器时不能将其设置为 7.0。
Servlet 容器(Tomcat、Jetty 等)
莫哈拉
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>// jsf-imp and jsf-api were been mereged into one jar
<version><!-- Check http://javaserverfaces.java.net --></version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
您还可以检查 org.glassfish:javax.faces 存储库以获取当前最新的 Mojarra 发布版本(截至目前为 2.2.13)。
我的脸
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-api</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-impl</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>