2010-09-17 12 views
1

Je cours la jetée intégrée à l'intérieur d'un récipient de ioc de ressort. Le ioc de printemps contient également un hsqldb intégré qui fait de l'ensemble de la configuration un environnement de développement d'applications web agréable et complet (sur une seule JVM). Maintenant j'essaye d'ajouter apache CXF à cet environnement pour faire le jetty hébergeant non seulement des servlets mais également des services Web.jetée intégrée de printemps + cxf

Malheureusement, je reçois une exception NullPointerException lorsque j'essaie d'accéder à http://127.0.0.1:8080/cxf/ * (les servlets et le contenu statique sont servis ok). Une idée de ce qui ne va pas?

2010-09-17 15:37:20,099 [btpool0-1 - /cxf/] DEBUG org.mortbay.log - REQUEST /cxf/ on [email protected] 
2010-09-17 15:37:20,100 [btpool0-1 - /cxf/] DEBUG org.mortbay.log - servlet=cxf-servlet-holder 
2010-09-17 15:37:20,100 [btpool0-1 - /cxf/] DEBUG org.mortbay.log - chain=null 
2010-09-17 15:37:20,100 [btpool0-1 - /cxf/] DEBUG org.mortbay.log - servelet holder=cxf-servlet-holder 
2010-09-17 15:37:20,101 [btpool0-1 - /cxf/] ERROR org.mortbay.log - /cxf/ 
java.lang.NullPointerException 
    at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:693) 
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:367) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) 
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) 
    at org.mortbay.jetty.Server.handle(Server.java:281) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:821) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:368) 
    at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442) 

Je suis printemps avec initialisation:

public static void main(String[] args) throws Exception { 
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[] { "jetty-beans.xml" , "cxf-beans.xml" }); 
    applicationContext.getBean("web-server", Server.class).join(); 
} 

jetée-beans.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean name="web-server" class="org.mortbay.jetty.Server" 
     init-method="start"> 
     <property name="connectors"> 
      <list> 
       <bean class="org.mortbay.jetty.nio.SelectChannelConnector"> 
        <property name="host" value="localhost" /> 
        <property name="port" value="8080" /> 
       </bean> 
      </list> 
     </property> 
     <property name="handlers"> 
      <list> 
       <ref bean="web-server-context-static" /> 
       <ref bean="web-server-context-servlet" /> 
       <ref bean="web-server-context-cxf" /> 
      </list> 
     </property> 
    </bean> 

    <bean name="web-server-context-static" class="org.mortbay.jetty.servlet.Context"> 
     <property name="contextPath" value="/static" /> 
     <property name="handler"> 
      <bean class="org.mortbay.jetty.handler.ResourceHandler"> 
       <property name="resourceBase" value="static" /> 
      </bean> 
     </property> 
    </bean> 

    <bean name="web-server-context-servlet" class="org.mortbay.jetty.servlet.Context"> 
     <property name="contextPath" value="/servlet" /> 
     <property name="handler"> 
      <bean class="org.mortbay.jetty.servlet.ServletHandler"> 
       <property name="servlets"> 
        <list> 
         <bean class="org.mortbay.jetty.servlet.ServletHolder"> 
          <property name="name" value="servlet-holder" /> 
          <property name="servlet"> 
           <bean class="test.TestServlet" /> 
          </property> 
         </bean> 
        </list> 
       </property> 
       <property name="servletMappings"> 
        <list> 
         <bean class="org.mortbay.jetty.servlet.ServletMapping"> 
          <property name="servletName" value="servlet-holder" /> 
          <property name="pathSpec" value="/*" /> 
         </bean> 
        </list> 
       </property> 
      </bean> 
     </property> 
    </bean> 

    <bean name="web-server-context-cxf" class="org.mortbay.jetty.servlet.Context"> 
     <property name="contextPath" value="/cxf" /> 
     <property name="handler"> 
      <bean class="org.mortbay.jetty.servlet.ServletHandler"> 
       <property name="servlets"> 
        <list> 
         <bean class="org.mortbay.jetty.servlet.ServletHolder"> 
          <property name="name" value="cxf-servlet-holder" /> 
          <property name="servlet"> 
           <bean class="org.apache.cxf.transport.servlet.CXFServlet"> 
           </bean> 
          </property> 
         </bean> 
        </list> 
       </property> 
       <property name="servletMappings"> 
        <list> 
         <bean class="org.mortbay.jetty.servlet.ServletMapping"> 
          <property name="servletName" value="cxf-servlet-holder" /> 
          <property name="pathSpec" value="/*" /> 
         </bean> 
        </list> 
       </property> 
      </bean> 
     </property> 
    </bean> 

</beans> 

CxF-beans.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> 

    <import resource="classpath:META-INF/cxf/cxf.xml" /> 
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> 
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 

    <bean id="test-ws-impl" class="test.TestWSImpl" /> 

    <jaxws:endpoint id="test-ws-endpoint" implementor="#test-ws-impl" 
     address="/testWS" /> 

</beans> 

classpath:

activation-1.1.jar 
commons-logging-1.1.1.jar 
cxf-2.2.10.jar 
jaxb-api-2.1.jar 
jaxb-impl-2.1.13.jar 
jcl-over-slf4j-1.6.1.jar 
jetty-6.1.3.jar 
jetty-annotations-6.1.3.jar 
jetty-util-6.1.3.jar 
log4j-1.2.16.jar 
neethi-2.0.4.jar 
org.springframework.aop-3.0.3.RELEASE.jar 
org.springframework.asm-3.0.3.RELEASE.jar 
org.springframework.beans-3.0.3.RELEASE.jar 
org.springframework.context-3.0.3.RELEASE.jar 
org.springframework.context.support-3.0.3.RELEASE.jar 
org.springframework.core-3.0.3.RELEASE.jar 
org.springframework.expression-3.0.3.RELEASE.jar 
servlet-api-2.5-6.1.3.jar 
slf4j-api-1.6.1.jar 
slf4j-log4j12-1.6.1.jar 
wsdl4j-1.6.2.jar 
XmlSchema-1.4.5.jar 

TestWSImpl.java:

package test; 

import javax.jws.WebService; 

@WebService(endpointInterface = "test.TestWSInterface") 
public class TestWSImpl implements TestWSInterface { 

    @Override 
    public String doTest(String testSubject) { 
     return "successfully tested:" + testSubject; 
    } 

} 

TestWSInterface.java

package test; 

import javax.jws.WebParam; 
import javax.jws.WebService; 

@WebService 
public interface TestWSInterface { 

    String doTest(@WebParam String testSubject); 

} 

Répondre

2

J'ai découvert que la configuration ci-dessus était mauvais:

Je n'ai pas utilisé WebApplicationContext avec a à initialiser avant CXFServlet. La solution simple consiste à utiliser la version non-printanière de CXFServlet - elle ne nécessite aucun ApplicationContext (je ne souhaite pas créer un ApplicationContext distinct pour les Web Services car j'ai besoin de partager DataSource entre eux), mais il est également initialisé (les services Web doivent être publiés dans le code). Après avoir résolu le problème de contexte, j'ai découvert que jetty 6.1 n'initialise pas le contexte de servlet correctement, tout fonctionne correctement après la mise à jour vers 7.x. Après avoir écrit le WebApplicationContext personnalisé, j'ai pu utiliser le ApplicationContext principal/racine en tant que WebApplicationContext, ce qui m'a permis d'utiliser la version Spring de CXFServlet avec environ 6 lignes de code de colle.

+0

pourriez-vous expliquer votre solution un peu plus? Comment avez-vous obtenu le contenu de votre application personnalisée dans jetty/cxfservlet? J'essaie de faire en sorte que le servlet recherche les services de jax-rs dans mon contexte principal et ne puisse pas le faire fonctionner. – Laures