Can';t让CXF JAX-RS和JSF一起工作
我正在尝试设置一个使用CXF JAX-RS和JSF的小示例应用程序Can';t让CXF JAX-RS和JSF一起工作,jsf,cxf,jax-rs,apache-tomee,facesservlet,Jsf,Cxf,Jax Rs,Apache Tomee,Facesservlet,我正在尝试设置一个使用CXF JAX-RS和JSF的小示例应用程序FooTest。我从CXF部分开始,实现了一个简单的服务(works)和一个名为home.html的小html页面(我可以在浏览器中访问它)。有关守则如下: web.xml <servlet> <servlet-name>RestServlet</servlet-name> <servlet-class>org.apache.cxf.jaxrs.servlet.CXF
FooTest
。我从CXF部分开始,实现了一个简单的服务(works)和一个名为home.html的小html页面(我可以在浏览器中访问它)。有关守则如下:
web.xml
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<param-value>com.test.FooService</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
... CXF stuff ...
<?xml version="1.0" encoding="UTF-8"?>
<faces-config 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-facesconfig_2_1.xsd"
version="2.1">
</faces-config>
现在我可以调用http://localhost:8080/FooTest/rest/foo
和http://localhost:8080/FooTest/home.html
。但是,当我开始定义并将FacesServlet
映射到*.html
并尝试访问home.html
时,我会得到一个NullPointerException
新建web.xml
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<param-value>com.test.FooService</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
... CXF stuff ...
<?xml version="1.0" encoding="UTF-8"?>
<faces-config 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-facesconfig_2_1.xsd"
version="2.1">
</faces-config>
我怎样才能解决这个问题
更新-更多配置信息
该应用程序在TomEE 1.5.2的JAX-RS版本上运行
src/main/webapp/WEB-INF/faces config.xml
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>jaxrs.serviceClasses</param-name>
<param-value>com.test.FooService</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
... CXF stuff ...
<?xml version="1.0" encoding="UTF-8"?>
<faces-config 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-facesconfig_2_1.xsd"
version="2.1">
</faces-config>
不确定这是评论还是回答,但您不应该在web.xml中设置
CXFNonSpringJaxrsServlet
和FacesServlet
,所有这些内容都已准备就绪。TomEE的目标是,您可以跳过服务器构建,直接进入应用构建
CXF完全集成到Tomcat中,甚至WS-Security也可以在Tomcat领域工作。您只需添加@ApplicationPath
注释的组件或用@Path
注释的EJB即可开始使用它,它们将被自动拾取和部署
MyFaces很好用,并且与CDI完全集成,因此即使是像
@ConversationScoped
这样的东西也可以开箱即用。你只需要你的faces config.xml
或一些@ManagedBean
类。不确定这是评论还是回答,但你不应该在你的web.xml中设置CXFNonSpringJaxrsServlet
和FacesServlet
,所有这些东西都已经准备好了。TomEE的目标是,您可以跳过服务器构建,直接进入应用构建
CXF完全集成到Tomcat中,甚至WS-Security也可以在Tomcat领域工作。您只需添加@ApplicationPath
注释的组件或用@Path
注释的EJB即可开始使用它,它们将被自动拾取和部署
MyFaces很好用,并且与CDI完全集成,因此即使是像
@ConversationScoped
这样的东西也可以开箱即用。你只需要你的faces-config.xml
或一些@ManagedBean
类。你的faces-config.xml在哪里?在src/main/webapp/WEB-INF
中,也请发布faces-config.xml。你的faces-config.xml在哪里?在src/main/webapp/WEB-INF
中,也请发布faces-config.xml。我刚开始讨厌CXF,因为它凌乱的文档和从Spring特性继承的配置开销。我花了一些时间才弄明白,我首先需要什么部件才能使它工作。但这是个好消息!刚刚尝试使用一个空的web.xml
,现在它可以工作了。我想我必须将我的.xhtml
文件重命名为.html
(.xhtml
不起作用),但这没关系。也许您可以在示例和文档中明确提到这一无需配置的内容?无论如何,非常感谢。我可能在JSF方面错了,FacesServet可能只用于启用xhtml的目的。您肯定可以做到,我们今天刚刚添加了一个示例,可以做到这一点,但JSF一般不需要。欢迎您随时提供有关文档的帮助!所有页面的右上角都有一个蓝色铅笔图标。点击它,你可以编辑页面并提交一种“拉请求”好吧,我有点太快了。我的示例页面出现了,但没有呈现JSF标记。实际解决方案:CXF配置不是必需的,与问题无关(这很好)。当您希望通过.html
访问.xhtml
JSF页面时,需要使用FacesServlet映射。我的示例的问题是,我将我的页面命名为home.html
,但javax.faces.DEFAULT\u后缀是.xhtml
。除非更改后缀,否则不能使用.html
.Oh。我刚开始讨厌CXF,因为它凌乱的文档和从Spring特性继承的配置开销。我花了一些时间才弄明白,我首先需要什么部件才能使它工作。但这是个好消息!刚刚尝试使用一个空的web.xml
,现在它可以工作了。我想我必须将我的.xhtml
文件重命名为.html
(.xhtml
不起作用),但这没关系。也许您可以在示例和文档中明确提到这一无需配置的内容?无论如何,非常感谢。我可能在JSF方面错了,FacesServet可能只用于启用xhtml的目的。您肯定可以做到,我们今天刚刚添加了一个示例,可以做到这一点,但JSF一般不需要。欢迎您随时提供有关文档的帮助!所有页面的右上角都有一个蓝色铅笔图标。点击它,你可以编辑页面并提交一种“拉请求”好吧,我有点太快了。我的示例页面出现了,但没有呈现JSF标记。实际解决方案:CXF配置不是必需的,与问题无关(这很好)。当您希望通过.html
访问.xhtml
JSF页面时,需要使用FacesServlet映射。我的示例的问题是,我将我的页面命名为home.html
,但javax.faces.DEFAULT\u后缀是.xhtml
。除非更改后缀,否则不能使用.html
。