cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ulhas Bhole <ulhas.bh...@iona.com>
Subject Re: Using CXF with Jetty Servlet Transport
Date Fri, 27 Jun 2008 14:27:42 GMT
Hi Serentos,

I have added users@cxf.apache.org so that others will have chance to 
look at your mail and respond to it.
I don't know much about servlet transport but as far as I remember CXF 
will match the URI prefix (e.g. http:// or jms:// or local://) with the 
URI prefix returned by TransportFactories that are instantiated and will 
choose the transport based on that.

For servlet transport I would suggest you take a look at system test in 
CXF source here 
http://svn.apache.org/repos/asf/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/servlet/

Regards,

Ulhas Bhole

Serethos@web.de wrote:
> At the moment my attempts and results are very confusing.
> So I will try to describe my approach. 
>
> First, the Webservice Interface:
>
> @WebService
> public interface HelloWorld
> {
>     String sayHi(@WebParam(name="text") String text);
> }
>  
> The implementing Service:
>
> @WebService(endpointInterface = "webservices.HelloWorld", serviceName = "hello")
> public class HelloWorldImplementation implements HelloWorld
> {
>     @Override
>     public String sayHi(String text)
>     {
>         return "waaaaazzzzuuuuuupp?! you said: " + text;
>     }
> } 
>
> The Servlet which shall control the Transport:
>
> public class HelloWorldServlet extends CXFNonSpringServlet implements Servlet
> {
>     @Override
>     public void loadBus(ServletConfig servletConfig) throws ServletException
>     {
>         super.loadBus(servletConfig);
>         
>         Bus bus = getBus();
>         BusFactory.setDefaultBus(bus);
>         HelloWorldImplementation service = new HelloWorldImplementation();
>         Endpoint.publish("/testService", service);
>     }
> }
>
> An finally the Server with its publishing mechanism:
>
> public class JettyServletLauncher
> {
>     public static void main(String args[])
>     {
> //        String busFactory = System.getProperty(BusFactory.BUS_FACTORY_PROPERTY_NAME);
>         System.setProperty(BusFactory.BUS_FACTORY_PROPERTY_NAME, "org.apache.cxf.bus.CXFBusFactory");
>         
>         Server server = new Server(8080);    
>         Context root = new Context(server, "/", Context.SESSIONS);
>         HelloWorldServlet nonSpringServlet = new HelloWorldServlet();
>         root.addServlet(new ServletHolder(nonSpringServlet), "/*");
>         
>         try
>         {
>             server.start();
>         }
>         catch (Exception e)
>         {
>             e.printStackTrace();
>         }
>       
>     }
> }
>
> Now to my masses of questions:
>
> 1. If I get it right, CXF detects if a jetty/ webserver instance is already bound. In
my case, I start
> jetty @ port:8080 with its root as context path. From my experiences I am used to bin
the soap service
> url as relative path which is added to the jetty's context path. In my example /testService,
so that the
> services should be bound to http://localhost:8080/testService?wsdl, the service itself
is mapped to the
> name "hello".
> This raises the exception I mentioned before, where you detected the problem of the wrong
protocol:
> an AnnotationVisitor (org.apache.cxf.common.injection.ResourceInjector@105691e) raised
an exception on element 
> public void org.apache.cxf.transport.jms.JMSTransportFactory.setBus(org.apache.cxf.Bus)
>
> You suggest to control the URIs again which are published through the endpoint. But why
should I add the
> protocol within the Endpoint.publish method?
> But if I do so, it seems that http-transport is chosen:
>
> Endpoint.publish("http://localhost:8080/testService", service);
>
> This URI seems redundant to me, because the port and the root path is already defined
by the jetty configuration.
>
> But the problem isn't solved then: accessing localhost:8080 gives me an hyperlink:
> {http://webservices/}HelloWorldImplementationPort
> which references:
> http://localhost:8080/testService?wsdl    - resulting in a message "No service was found."
>
> I am especially wondering how (name of) the hyperlink is created ..
>
> just tried another thing:
> Endpoint.publish("http://localhost/testService", service); // notice: no port
>
> This works (I get a wsdl)! But now an IllegalStateException from the servlet is thrown
..
> java.lang.IllegalStateException: STREAM
> 	at org.mortbay.jetty.Response.getWriter(Response.java:585)
>
> 2. As comparison I used the internally started jetty, the main code reduces then to this:
>
> CXFNonSpringServlet servlet = new CXFNonSpringServlet();
> BusFactory.setDefaultBus(servlet.getBus());
> HelloWorldImplementation service = new HelloWorldImplementation();
> Endpoint.publish("http://localhost:8080/testService", service);
> JOptionPane.showMessageDialog(null, "Stop Server");
>
> This works pretty good, the URI http://localhost:8080/testService?wsdl creates a valid
wsdl.
>
> 3. My main problems seems to be the choice of the transport protocol, where JMS is used.
Is this configuration
> only dependend on the URI I use by the endpoint publishing?
>
> 4. There is one point within the use of the framework, I do not understand:
> The Endpoint class is from the JDK. Enpoint.publish() uses the Provider-factory to get
EndpointImpl for publishing
> the service. Where and at which point is the Endpoint-Implementation of CXF injected?
>
> Many thanks in advance for digging through my questions!
>
>
> Ulhas Bhole wrote:
>   
>> Hi Serethos,
>>
>> You are picking up JMS transport and not servlet. Make sure you have 
>> proper URI in your wsdl service and endpoint.publish() call.
>>
>> Regards,
>>
>> Ulhas Bhole
>>
>> Serethos wrote:
>>     
>>> Hello!
>>>
>>> I need to get the Servlet Transport of CXF and Jetty to work together but
>>> have several problems with it.
>>> Searching within forums, mailing lists and the inet there is often
>>> mentioned
>>> the complete source the to code snippet example of the user doc
>>> (http://cwiki.apache.org/CXF20DOC/servlet-transport.html).
>>> The problem ist that the links to the cxf repository are always dead
>>> (like
>>> this one:
>>> https://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/servlet/NoSpringServletServer.java
>>> )
>>>
>>> Is there any source to get all classes of the example so that I can test
>>> it
>>> and exclude an error of mine?
>>>
>>>
>>> As addition I want to attach my StackStrace of the error. Perhaps someone
>>> could give me a hint, what the problem could be (and what an
>>> 'AnnotationVisitor' is)
>>>
>>> an AnnotationVisitor
>>> (org.apache.cxf.common.injection.ResourceInjector@383118) raised an
>>> exception on element public void
>>> org.apache.cxf.transport.jms.JMSTransportFactory.setBus(org.apache.cxf.Bus).
>>> java.lang.NullPointerException
>>> 	at javax.naming.InitialContext.getURLScheme(InitialContext.java:269)
>>> 	at
>>> javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:318)
>>> 	at javax.naming.InitialContext.lookup(InitialContext.java:392)
>>> 	at
>>> org.apache.cxf.transport.servlet.ServletContextResourceResolver.resolve(ServletContextResourceResolver.java:62)
>>> 	at
>>> org.apache.cxf.resource.DefaultResourceManager.findResource(DefaultResourceManager.java:99)
>>> 	at
>>> org.apache.cxf.resource.DefaultResourceManager.resolveResource(DefaultResourceManager.java:55)
>>> 	at
>>> org.apache.cxf.common.injection.ResourceInjector.resolveResource(ResourceInjector.java:401)
>>> 	at
>>> org.apache.cxf.common.injection.ResourceInjector.visitMethod(ResourceInjector.java:185)
>>> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> 	at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> 	at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> 	at java.lang.reflect.Method.invoke(Method.java:597)
>>> 	at
>>> org.apache.cxf.common.annotation.AnnotationProcessor.visitAnnotatedElement(AnnotationProcessor.java:131)
>>> 	at
>>> org.apache.cxf.common.annotation.AnnotationProcessor.processMethods(AnnotationProcessor.java:103)
>>> 	at
>>> org.apache.cxf.common.annotation.AnnotationProcessor.accept(AnnotationProcessor.java:90)
>>> 	at
>>> org.apache.cxf.common.injection.ResourceInjector.inject(ResourceInjector.java:81)
>>> 	at
>>> org.apache.cxf.common.injection.ResourceInjector.inject(ResourceInjector.java:76)
>>> 	at
>>> org.apache.cxf.bus.extension.ExtensionManagerImpl.loadAndRegister(ExtensionManagerImpl.java:165)
>>> 	at
>>> org.apache.cxf.bus.extension.ExtensionManagerImpl.activateViaNS(ExtensionManagerImpl.java:86)
>>> 	at
>>> org.apache.cxf.bus.extension.ExtensionManagerImpl.activateAll(ExtensionManagerImpl.java:94)
>>> 	at org.apache.cxf.bus.extension.DeferredMap.undefer(DeferredMap.java:36)
>>> 	at
>>> org.apache.cxf.transport.DestinationFactoryManagerImpl.getDestinationFactoryForUri(DestinationFactoryManagerImpl.java:136)
>>> 	at
>>> org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpointInfo(AbstractWSDLBasedEndpointFactory.java:160)
>>> 	at
>>> org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:102)
>>> 	at
>>> org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:114)
>>> 	at
>>> org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:160)
>>> 	at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:322)
>>> 	at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:244)
>>> 	at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:194)
>>> 	at
>>> org.apache.cxf.jaxws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:84)
>>> 	at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
>>> 	at xoz.JettyServletLauncher.main(JettyServletLauncher.java:55)
>>>   
>>>       
>> ----------------------------
>> IONA Technologies PLC (registered in Ireland)
>> Registered Number: 171387
>> Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland
>>
>>
>>     
> Quoted from: 
> http://www.nabble.com/Using-CXF-with-Jetty-Servlet-Transport-tp18136831p18137167.html
>   


----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message