Hi Daniel,

This was with CXF 2.1.1 I'm actually working on getting CXF working
within infiniflow (based on newton - http://newton.codecauldron.org)
as a provider of a web services binding.

I've now managed to get the JaxWsProxyFactoryBean working now though
it still needs the patch I mentioned to
org.apache.cxf.frontend.ClientProxyFactoryBean - diff file attached.
In this usecase the CXF libraries are packaged in one bundle but the
"client" code i.e. the code that asks for the proxy to be created is
packaged in a separate bundle. The CXF code is then linked to the
client through the SCA of a binding.

This allows multiple client bundles to reuse CXF without having to
embed it in the client bundle (or for that matter even know that CXF
is involved - they just ask for an SCA <binding.ws /> which happens to
be implemented by CXF). However this means that the client bundle does
not have the CXF libraries in it's bundle classpath - hence the need
to do some classloader juggling via the Thread.contextClassLoader.

In general I'm not a big fan of using Thread.contextClassLoader as
it's a little ambiguous - prefer an explicit declaration of the
classloader to be used but this would have been a much larger change
to the CXF code which I didn't want to attempt without the aid of a
safety net :)

The "javax.xml.ws.WebServiceException: Could not find wsdl:binding
operation info..." issue turned out to be with the way I was using the
interface/impl - the combination that worked in the end was to
explicitly add the @WebService etc annotations to the class/interface
etc, like so:

package com.paremus.infiniflow.example.cxf;

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

@WebService
public interface HelloWorld {
       String sayHello(@WebParam(name="text") String name);
}

-------------------------------------------------------------

package com.paremus.infiniflow.example.cxf;

import javax.jws.WebService;

@WebService(endpointInterface = "com.paremus.infiniflow.example.cxf.HelloWorld",
       serviceName = "HelloWorld")

public class HelloWorldImpl implements HelloWorld {
       public String sayHello(String name) {
               return "Hello " + name;
       }
}

I didn't get around to exploring what the minimum set of annotations
was to get this working. Incidentally is there a case for CXF
automagically inferring webservice info from interfaces that are this
trivial? It seems a little verbose in this case to have to annotate a
single method interface/impl. Though I appreciate this is not the
general use case...

I'm still having some problems with https but not sure this is OSGi
related so possibly best to follow up in a separate email thread if
necessary. I currently suspect issue is with my certificate chain as
get a message

2008-07-03 13:23:25.023::WARN:  EXCEPTION
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
       at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)

When the JaxWsProxy tries to invoke the method call on the client.

Regards,

Dave

2008/7/1 Daniel Kulp <[EMAIL PROTECTED]>:
>
> Have you tried this with CXF 2.1.1 or 2.1 or other?
>
> We did some work in 2.1.1 to hopefully help some of the issues, but I'm not 
> really sure about this specific issue.
>
>
> In general, we kind of recommend using the spring dynamic modules for OSGi.   
> The servicemix 4 folks have an example at:
> http://servicemix.apache.org/SMX4/cxf-examples.html#CXFexamples-Inside
> that shows how that works.   When you do that, all the spring config things 
> should work.
>
> Dan
>
> On Jun 27, 2008, at 12:02 PM, David Savage wrote:
>
>> Hi there,
>>
>> I'm trying to get cxf to work in an OSGi environment and have been banging 
>> my head against the desk a bit, suspect it might be due to leaping in at the 
>> deep end but any help would be appreciated.
>>
>> Ok here's what I've got working:
>>
>>  JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
>>  svrFactory.setServiceClass(HelloWorld.class);
>>  svrFactory.setServiceBean(HelloWorldImpl());
>>  svrFactory.setAddress("http://localhost:9000/hello"; );
>>  svrFactory.create();
>>
>> This launches an internal jetty server and when I test this using a web 
>> browser I can at least see that the server is running as I get a soap 
>> response:
>>
>> <soap:Envelope>
>>  <soap:Body>
>>   <soap:Fault>
>>     <faultcode>soap:Server</faultcode>
>>     <faultstring>No such operation: </faultstring>
>>   </soap:Fault>
>>  </soap:Body>
>> </soap:Envelope>
>>
>> However I've not been able to get a client working in OSGi. Initially this 
>> was due to code in the org.apache.cxf.frontend.ClientProxyFactoryBean which 
>> assumed the classloader to generate the proxy would be the loader of the 
>> client interface. I've worked around that in a local patch here by setting 
>> Thread.contextClassLoader.
>>
>> Here's what I have on the client side:
>>
>>  JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
>>  factory.setServiceClass(reference.getInterface());
>>  factory.setAddress("http://localhost:9000/hello";);
>>  // set context classloader
>>  ...
>>  HelloWorld proxy = factory.create();
>>  proxy.sayHello("World");
>>
>>
>> However the client still fails due to a null BindingDetails object which is 
>> loaded when my test method is invoked:
>>
>> javax.xml.ws.WebServiceException: Could not find wsdl:binding operation info 
>> for web method sayHello.
>>        at 
>> org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:150)
>>        at $Proxy35.sayHello(Unknown Source)
>>
>> Is there a stage I'm missing here?
>>
>> I'm also trying to get cxf to work with an https connection (both client and 
>> server). On the server side I've figured out that the process has something 
>> to do with doing something like:
>>
>> server = svrFactory.create();
>>
>> JettyHTTPDestination dest = (JettyHTTPDestination) server.getDestination();
>> JettyHTTPServerEngine engine = (JettyHTTPServerEngine) dest.getEngine();
>>
>> if ( secure ) {
>>  TLSServerParameters params = new TLSServerParameters();
>>  // set params
>>  engine.setTlsServerParameters(params);
>> }
>>
>> But again I'm not having much luck. Is there any example code I can follow 
>> or that someone can post to show how this should work?
>>
>> Thanks in advance for any help.
>>
>> Regards,
>>
>> Dave
>>
>> _______________________________________________________________________
>> Paremus Limited. Registered in England
>> No. 4181472
>> Registered Office: 22-24 Broad Street, Wokingham, Berks RG40 1BA
>> Postal Address: 107-111 Fleet Street, London, EC4A 2AB
>> The information transmitted is intended only for the person(s) or entity to 
>> which it is addressed and may contain confidential and/or privileged 
>> material. Any review, retransmission, dissemination or other use of, or 
>> taking of any action in reliance upon, this information by persons or 
>> entities other than the intended recipient is prohibited.
>> If you received this in error, please contact the sender and delete the 
>> material from any computer.
>> _______________________________________________________________________
>
> ---
> Daniel Kulp
> [EMAIL PROTECTED]
> http://www.dankulp.com/blog
>
>
>
>

Reply via email to