Не могу заставить 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
классы.