【问题标题】:Can't get CXF JAX-RS and JSF to work together无法让 CXF JAX-RS 和 JSF 一起工作
【发布时间】:2013-04-18 20:28:56
【问题描述】:

我正在尝试设置一个使用 CXF JAX-RS 和 JSF 的小型示例应用程序 FooTest。我从 CXF 部分开始,实现了一个简单的服务(工作)和一个名为 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>

FooService.java

@Path("/rest")
public class FooService {    
    @Path("/foo")
    @GET
    @Produces("application/json; charset=UTF-8")
    public String getFoo() {
        // returns json
    }
}

现在我可以致电http://localhost:8080/FooTest/rest/foohttp://localhost:8080/FooTest/home.html。但是,当我开始定义 FacesServlet 并将其映射到 *.html 并尝试访问 home.html 时,我得到了 NullPointerException

新的 web.xml

<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 ...

导致

Apr 25, 2013 6:08:17 AM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
    at org.apache.myfaces.shared.context.flash.FlashImpl.isKeepMessages(FlashImpl.java:388)
    at org.apache.myfaces.shared.context.flash.FlashImpl._saveMessages(FlashImpl.java:665)
    at org.apache.myfaces.shared.context.flash.FlashImpl.doPostPhaseActions(FlashImpl.java:269)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:254)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
    at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:369)
    at org.apache.myfaces.view.jsp.JspViewDeclarationLanguage.buildView(JspViewDeclarationLanguage.java:99)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:78)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
    ... infinite loop from FacesServlet:199 on ...

我该如何解决这个问题?

更新 - 更多配置信息

应用程序在 TomEE 1.5.2 的 JAX-RS 版本上运行。

src/main/webapp/WEB-INF/faces-config.xml

<?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>

更新 - 解决方案

(感谢 David Blevins 的澄清并指出一个有用的例子)

去掉CXF配置部分,不是必须的。将home.html 重命名为home.xhtml,因为.xhtml 是JSF 页面的javax.faces.DEFAULT_SUFFIX。如果您想使用.html 扩展名访问您的JSF 页面,请保留FacesServlet 映射。这就足够了:

<?xml version="1.0" encoding="UTF-8"?>
<web-app ... >
    <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>
</web-app>

【问题讨论】:

  • 你的 faces-config.xml 在哪里?
  • src/main/webapp/WEB-INF
  • 请同时发布 faces-config.xml。

标签: jsf cxf jax-rs apache-tomee facesservlet


【解决方案1】:

不确定这应该是评论还是答案,但您不应该在 web.xml 中设置 CXFNonSpringJaxrsServletFacesServlet,所有这些内容都已准备就绪。 TomEE 的目标是您可以跳过服务器构建并直接进行应用构建。

CXF 完全集成到 TomEE 中的 Tomcat 中,甚至 WS-Security 也可以在 Tomcat 领域上运行。您只需通过添加带有@ApplicationPath 注释的组件或带有@Path 注释的EJB 来开始使用它,它们将被自动拾取和部署。

MyFaces 很好用,并且与 CDI 完全集成,因此即使像 @ConversationScoped 这样的东西也可以开箱即用。你只需要你的faces-config.xml 或一些@ManagedBean 类。

【讨论】:

  • 哦。我刚开始讨厌 CXF,因为它的文档杂乱无章,而且继承自 Spring 特性的配置开销。我花了一些时间来弄清楚我真正需要哪些部分才能让它首先工作。但这是个好消息!刚刚尝试使用空的web.xml,现在它可以工作了。我想我必须将我的.xhtml 文件重命名为.html.xhtml 不起作用),但这很好。也许您可以在示例和文档中明确提到这个不需要配置的东西?无论如何,非常感谢。
  • 我在 JSF 部分可能错了,FacesServet 可能仅用于启用 xhtml 的目的。您绝对可以这样做,我们今天刚刚添加了一个示例,但一般来说 JSF 不需要。总是欢迎对文档的帮助!所有页面的右上角都有一个蓝色的小铅笔图标。点击它,您可以编辑页面并提交一种“拉取请求”
  • 好吧,我有点太快了。我的示例页面出现了,但没有呈现 JSF 标记。实际解决方案:CXF 配置不是必需的,与问题无关(这很好)。当您想通过.html 访问.xhtml JSF 页面时,需要 FacesServlet 映射。我的示例的问题是,我将页面命名为home.html,但javax.faces.DEFAULT_SUFFIX.xhtml。除非更改后缀,否则不能使用.html
猜你喜欢
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多