2013-04-25 4 views
1

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/foohttp://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.htmlhome.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> 
+0

faces-config.xml의 위치는 어디입니까? –

+0

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

+0

faces-config.xml도 게시하십시오. –

답변

1

확실하지 여부,하지만 당신은, 모든 물건이 거기 갈 준비가 설정 CXFNonSpringJaxrsServlet하고 web.xml에 FacesServlet입니다 안 :이 충분하다. TomEE의 목표는 서버 구축을 건너 뛰고 직접 앱 구축을 진행할 수 있다는 것입니다.

CXF는 TomEE의 Real-Time Security가 작동하는 지점까지 TomEE의 Tomcat에 완전히 통합되어 있습니다. 주석 처리 된 구성 요소 또는 @Path으로 주석 처리 된 EJB를 @ApplicationPath 추가하여 사용하기 시작하면 자동으로 선택되어 배포됩니다.

MyFaces는 CDI와 완벽하게 통합되어있어 @ConversationScoped과 같은 항목도 사용할 수 있습니다. faces-config.xml 또는 @ManagedBean 클래스가 필요합니다.

+0

오. CXF가 지저분한 문서와 Spring 환경에서 상속 된 구성 오버 헤드 때문에 CXF를 싫어하기 시작했습니다. 처음에 실제로 작동하게하려면 실제로 어느 부분이 필요한지 알아내는 데 시간이 걸렸습니다. 그러나 이것은 좋은 소식입니다! 그냥 빈'web.xml'을 사용해 보았는데 이제는 작동합니다. 내'.xhtml' 파일을'.html'로 이름을 바꿔야한다고 생각합니다. ('.xhtml'은 작동하지 않습니다.)하지만 괜찮습니다. 어쩌면 당신은 명시 적으로 예제와 문서에서이 구성이 필요없는 것을 언급 할 수 있습니까? 어쨌든, 고마워. – Jack

+0

JSF 부분에서 잘못된 것일 수 있습니다. FacesServet은 xhtml을 활성화하는 목적으로 만 필요할 수 있습니다. 분명히 할 수 있습니다. 오늘 예제를 추가했지만 일반적으로 JSF에서는 필요하지 않습니다. 문서에 대한 도움말은 언제나 환영합니다! 모든 페이지의 오른쪽 상단에 파란색 연필 아이콘이 있습니다. 그것을 클릭하면 페이지를 편집하고 "pull request"종류를 제출할 수 있습니다. –

+0

그리고 StackOverflow를 사용해 주셔서 감사합니다. :) –