2013-04-25 3 views
1

Я пытаюсь настроить небольшое примерное приложение FooTest, которое использует CXF JAX-RS и JSF. Я начал с части CXF, реализовал простую службу (работает) и небольшую html-страницу с именем home.html (я могу получить к ней доступ в своем браузере). Соответствующий код выглядит следующим образом:Не удается заставить CXF JAX-RS и JSF работать вместе

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

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

Update - Больше конфигурации Информация

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

SRC/главная/веб-приложение/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> 

Update - Решение

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

Извлеките конфигурационную часть 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> 
+0

Где находятся ваши лица-config.xml? –

+0

В 'src/main/webapp/WEB-INF' – Jack

+0

Пожалуйста, напишите faces-config.xml. –

ответ

1

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

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

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

+0

Ох. Я только начинал ненавидеть CXF за его грязную документацию и накладные расходы на конфигурацию, унаследованные от природы Spring. Мне потребовалось некоторое время, чтобы выяснить, какие части мне действительно нужны, чтобы заставить его работать в первую очередь. Но это хорошая новость! Просто попробовал использовать пустой 'web.xml', и теперь он работает. Думаю, мне нужно переименовать мои файлы .xhtml' в .html' ('.xhtml' не работает), но это нормально. Может быть, вы можете прямо указать эту необязательную конфигурацию в примерах и документации? Во всяком случае, большое спасибо. – Jack

+0

Возможно, я ошибаюсь в части JSF, FacesServet может понадобиться только для того, чтобы включить xhtml. Вы можете это сделать, мы просто добавили пример сегодня, который делает это, но не должен быть необходим для JSF в целом. Помощь в документах всегда приветствуется! На всех страницах есть значок с синим карандашом в правом верхнем углу. Нажмите это, и вы можете отредактировать страницу и отправить своего рода «запрос на тяну» –

+0

И очень рад, что он работает и добро пожаловать в StackOverflow! :) –