CXF JAX-RS와 JSF를 사용하는 작은 예제 애플리케이션 FooTest
을 설정하려고합니다. CXF 부분부터 시작하여 간단한 서비스 (작동)와 home.html이라는 작은 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 ...
에 리드?
업데이트 - 더 많은 설정 정보
응용 프로그램은 TomEE 1.5.2의 JAX-RS 버전에서 실행됩니다.
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>
업데이트 - 솔루션
(해명 데이비드 블레 빈스에게 감사하고 유용한 예에 저를 가리키는)
CXF 구성 부분을 제거 할 필요는 없습니다. 은 JSF 페이지의 경우 javax.faces.DEFAULT_SUFFIX
이므로 home.html
을 home.xhtml
으로 변경하십시오. .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' – Jack
faces-config.xml도 게시하십시오. –