1

我正在尝试设置一个FooTest使用 CXF JAX-RS 和 JSF 的小型示例应用程序。我从 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/fooand http://localhost:8080/FooTest/home.html。但是,当我开始定义和映射FacesServletto*.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.htmlhome.xhtml,因为.xhtmljavax.faces.DEFAULT_SUFFIX用于 JSF 页面。FacesServlet如果您想使用扩展访问您的 JSF 页面,请保留该映射.html。这就足够了:

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

1 回答 1

1

不确定这应该是评论还是答案,但您不应该设置CXFNonSpringJaxrsServlet并且FacesServlet在您的 web.xml 中,所有这些东西都在那里并准备就绪。TomEE 的目标是您可以跳过服务器构建并直接进行应用程序构建。

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

MyFaces 非常好用,并且与 CDI 完全集成,因此即使是@ConversationScoped开箱即用之类的东西也是如此。你只需要你的faces-config.xml或一些@ManagedBean课程。

于 2013-04-25T19:47:49.130 回答