Не могу заставить CXF JAX-RS и JSF работать вместе

Я пытаюсь настроить небольшой пример приложения FooTest который использует CXF JAX-RS и JSF. Я начал с части CXF, реализовал простой сервис (работает) и небольшую HTML-страницу с именем home.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/foo а также http://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 ...

Как я могу это исправить?

Обновление - дополнительная информация о конфигурации

Приложение работает на JAX-RS версии TomEE 1.5.2.

SRC / Главный / WebApp/WEB-INF/ лица-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>

Обновление - Решение

(Спасибо Дэвиду Блевинсу за разъяснения и указание на полезный пример)

Удалите часть конфигурации CXF, это не требуется. переименовывать home.html в home.xhtml, поскольку .xhtml это javax.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>

1 ответ

Решение

Не уверен, должен ли это быть комментарий или ответ, но вы не должны настраивать CXFNonSpringJaxrsServlet а также FacesServlet в вашем web.xml все это есть и готово к работе. Цель TomEE - вы можете пропустить сборку сервера и перейти непосредственно к сборке приложения.

CXF полностью интегрирован в Tomcat в TomEE до такой степени, что даже WS-Security работает на Tomcat Realms. Вы просто начинаете использовать его, добавив @ApplicationPath аннотированные компоненты или EJB с пометкой @Path и они будут собраны и развернуты автоматически.

MyFaces хорош и полностью интегрирован с CDI, так что даже такие вещи, как @ConversationScoped работать из коробки. Вам просто нужно ваше faces-config.xml или несколько @ManagedBean классы.

Другие вопросы по тегам