2010-09-25 7 views
2

J'essaie de créer un service web simple avec CXF, Jetty et Spring. Je crée une interface de serviceService Web utilisant CXF, Jetty et Spring

@WebService 
public interface AnonymousService { 

    @WebMethod 
    public String getVersion(); 
} 

et sa mise en œuvre

@Service("anonymousService") 
@WebService(
    serviceName = "AnonymousService", 
    targetNamespace = "http://ws.test/", 
    endpointInterface = "test.ws.AnonymousService" 
) 
public class AnonymousServiceImpl { 
    public String getVersion() { 
     return "Version"; 
    } 
} 

étape suivante ajouter à Spring déclaration de point de terminaison de fichier de configuration de contexte

<jaxws:endpoint id="anonymousServiceEndpoint" 
    implementor="#anonymousService" address="/anonymous" /> 

et configurer haricots Jetty

<bean id="server" class="org.mortbay.jetty.Server" destroy-method="stop"> 
    <property name="connectors"> 
    <list> 
      <bean id="connector" class="org.mortbay.jetty.nio.SelectChannelConnector"> 
       <property name="port" value="${server.port}" /> 
      </bean> 
     </list> 
    </property> 

    <property name="handlers"> 
     <list> 
      <ref bean="workflowContext" /> 
     </list> 
    </property> 
</bean> 

<bean name="workflowContext" class="org.mortbay.jetty.servlet.Context"> 
    <property name="contextPath" value="/" /> 

     <property name="servletHandler"> 
      <bean class="org.mortbay.jetty.servlet.ServletHandler"> 
       <property name="servlets"> 
        <list> 
         <bean class="org.mortbay.jetty.servlet.ServletHolder"> 
          <property name="name" value="services" /> 
          <property name="servlet"> 
           <bean class="org.apache.cxf.transport.servlet.CXFServlet" /> 
           <!--<bean class="org.apache.cxf.transport.servlet.CXFNonSpringServlet" />--> 
          </property> 
         </bean> 
        </list> 
       </property> 

       <property name="servletMappings"> 
        <list> 
         <bean class="org.mortbay.jetty.servlet.ServletMapping"> 
          <property name="servletName" value="services" /> 
          <property name="pathSpec" value="/services/*" /> 
         </bean> 
        </list> 
       </property> 
      </bean> 
     </property> 
</bean> 

Malheureusement, quand je commence mon application, je reçois suivre trace de la pile

25.09.2010 14:48:07 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 
INFO: Creating Service {http://ws.test/}AnonymousService from class name.krestjaninoff.application.interfaces.AnonymousService 
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'anonymousServiceEndpoint': Invocation of init method failed; nested exception is javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at name.krestjaninoff.application.Server.main(Server.java:20) 
Caused by: javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException 
    at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:275) 
    at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:209) 
    at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:404) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1536) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409) 
    ... 12 more 
Caused by: org.apache.cxf.service.factory.ServiceConstructionException 
    at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:139) 
    at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:167) 
    at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:346) 
    at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:259) 
    ... 21 more 
Caused by: java.net.MalformedURLException: no protocol: /anonymous 
    at java.net.URL.<init>(URL.java:583) 
    at java.net.URL.<init>(URL.java:480) 
    at java.net.URL.<init>(URL.java:429) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.<init>(JettyHTTPDestination.java:93) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPTransportFactory.createDestination(JettyHTTPTransportFactory.java:116) 
    at org.apache.cxf.transport.http_jetty.JettyHTTPTransportFactory.getDestination(JettyHTTPTransportFactory.java:103) 
    at org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:90) 
    at org.apache.cxf.endpoint.ServerImpl.<init>(ServerImpl.java:69) 
    at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:118) 
    ... 24 more 

Qu'est-ce que je fais mal?

Répondre

10

Mon problème résolu en ajoutant le fichier de configuration de cxf.xml dans la racine du classpath

<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-3.0.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"/> 

</beans> 

Je ne fais pas ça avant, parce que je ne comprenais pas ce qui devrait être dans META_INF/CxF/.xml des dossiers. En fait, ces fichiers n'ont pas besoin d'être créés - ils existent déjà dans les paquets cxf-rt-!

+2

Dans la nouvelle version de CXF, vous avez seulement besoin de cxf.xml et non des autres importations: \t

1

Avez-vous vu la dernière exception de la chaîne:

Caused by: java.net.MalformedURLException: no protocol: /anonymous 

La chaîne «/anonyme » est dans les JAXWS: balise point final, il utilise probablement une autre syntaxe là.

+0

J'ai écrit jaxws: balise endpoint conformément à ces instructions: http://cxf.apache.org/docs/writing-a-service-with-spring.html, http://cxf.apache.org/docs /jax-ws-configuration.html. – mikhail

Questions connexes