On Tuesday, August 23, 2011 1:45:40 PM Jesse Pangburn wrote: > The JaxWsProxyFactoryBean seems to have all the stuff we needed from the > JaxWsClientFactoryBean, plus the handler chain. As the factory is never > used anyway, just fields are copied out of it, changing the clientFac > object type to JaxWsProxyFactoryBean was sufficient to allow the addition > of the handler chain code.
Yep. Thinking about this some more, it's definitely the better solution, IMO. > I've tested this by creating a ridiculously simple handler and verifying > that it gets called when configured in the jaxws:client element. > > The patch is submitted into the issue. Please go over it carefully if you > can as I'm still really new to CXF and that code makes a lot of assumptions > about how things work. It seems to be successful from my tests by putting > the ws-addressing element underneath the cxf:bus element or underneath the > jaxws:client element or in the Dispatch factory method. Also tried moving > the cxf:logging element around and it works as expected too. So I think > it's good but just think it could use another pair of eyes. The obvious CheckStyle issues aside (I've fixed), it looks pretty good. While reviewing it, I noticed there is also the createDispatch calls that take the JAXBContext that have similar issues. I've gone ahead and combined the logic for the JAXBContext and Class<T> versions into a single method to not duplicate the code and am running a full set of tests with it now. The difference is really just down to creating a JAXBDataBinding or SourceDatabinding and calling a different DispatchImpl constructor. Dan > > Thanks, > Jesse > > -----Original Message----- > From: Daniel Kulp [mailto:[email protected]] > Sent: Tuesday, August 23, 2011 10:59 AM > To: [email protected] > Cc: Jesse Pangburn > Subject: Re: Can Dispatch API be used with jaxws:client Spring > configuration? > On Monday, August 22, 2011 1:39:24 PM Jesse Pangburn wrote: > > There's now a bug for these configuration problems: > > https://issues.apache.org/jira/browse/CXF-3754. I've submitted a patch > > and debugged through it to verify it allows setting properties, > > address, and bus now. However, I could not find where to get the > > handler information. I believe it should be there because a > > jaxws:client can have jaxws:handler entries according to the schema but > > I could not find that data in the client factory object that got > > configured by spring. > > Hmm... they are on the JaxWsProxyFactoryBean. Technically, the spring > configuration is configuring a JaxWsProxyFactoryBean, not a > JaxWsClientFactoryBean. I'm wondering if it make sense to have the > ServiceImpl create a JaxWsProxyFactoryBean, pass that into configureObject, > then use the JaxWsClientFactoryBean out of there along with the handlers > from there. > > The other option would be to move the handler related stuff from > JaxWsProxyFactoryBean to JaxWsClientFactoryBean (and add wrapper methods to > the proxy factory) so that the JaxWsClientFactoryBean would have everything > you need. I'd be OK with either approach. > > > Dan > > > Thanks, > > Jesse > > > > -----Original Message----- > > From: Daniel Kulp [mailto:[email protected]] > > Sent: Friday, August 19, 2011 2:24 PM > > To: [email protected] > > Cc: Jesse Pangburn > > Subject: Re: Can Dispatch API be used with jaxws:client Spring > > configuration? > > > > On Friday, August 19, 2011 3:34:53 PM Jesse Pangburn wrote: > > > It seems that the ServiceImpl code is copying over stuff from the > > > following items (all this stuff is near the 620 line): features, > > > interceptors, conduit selector > > > > > > It seems to do nothing with the following: > > > address, bus, properties, handlers > > > > > > I don't know which of these things it SHOULD do. To my noobie > > > viewpoint, it seems like it should copy the address information if > > > present, set the bus in the endpoint object if present, and copy any > > > properties found into the endpoint object. I have no idea what to > > > do > > > with handlers. > > > > Yep. I agree with all of that. For the Handler, you would need to > > build up a HandlerChain and call > > dispatch.getBinding().setHandlerChain(..) with is. > > > > > Unless anyone disagrees, I'll make a bug report for this and patch > > > it. > > > I'll also patch the DispatchImpl to respect the ws-addressing > > > feature > > > if set in the jaxws:client bean. > > > > Perfect. :-) > > > > Dan > > > > > Thanks, > > > Jesse > > > > > > -----Original Message----- > > > From: Jesse Pangburn [mailto:[email protected]] > > > Sent: Friday, August 19, 2011 12:54 PM > > > To: Daniel Kulp; [email protected] > > > Subject: RE: Can Dispatch API be used with jaxws:client Spring > > > configuration? > > > > > > When I debug into ServiceImpl line 610, it gets down to > > > org.apache.cxf.configuration.spring.ConfigurerImpl and line 151 > > > throws: > > > org.springframework.beans.factory.NoSuchBeanDefinitionException: No > > > bean named > > > '{urn:ihe:iti:xds-b:2007}DocumentRegistry_Port_Soap12.jaxws-client.p > > > roxy Fac tory' is defined > > > > > > This is caught and logged FINE, which amusingly has the comment: > > > // users often wonder why the settings in > > > their > > > configuration > > > > > > files seem // to have no effect - the most common cause is that they > > > have > > > been using // incorrect bean ids > > > > > > If I check my spring context and call > > > context.getBeanDefinitionNames() I get the following (among > > > others): > > > registryClient.jaxws-client.proxyFactory > > > > > > It does not have an entry with that name from the exception. The > > > similar > > > entry is does have is from the id attribute, so I tried removing > > > that id attribute (and other things) but leaving the createdFromAPI > > > (because that > > > makes the .jaxws-client part of the name) from jaxws:client and just > > > leaving: <jaxws:client > > > name="{urn:ihe:iti:xds-b:2007}DocumentRegistry_Port_Soap12" > > > address="http://localhost:30320/tf6/services/xdsregistryb" > > > > > > createdFromAPI="true"> > > > <jaxws:features> > > > > > > <wsa:addressing/> > > > > > > </jaxws:features> > > > > > > </jaxws:client> > > > > > > Now the ConfigurerImpl matches the bean name and configured it and > > > ServiceImpl line 621 does apply the ws-addressing feature, but > > > unfortunately the addressing is wrong. Probably same problem as > > > yesterday when I tried configuring it via the cxf:bus, that code in > > > DispatchImpl is probably not enabling ws-addressing. Also, it uses > > > the > > > address from the WSDL and ignores the address in the jaxws:client > > > element. > > > > > > At least it's closer. > > > > > > Thanks, > > > Jesse > > > > > > -----Original Message----- > > > From: Daniel Kulp [mailto:[email protected]] > > > Sent: Thursday, August 18, 2011 7:51 PM > > > To: [email protected] > > > Cc: Jesse Pangburn > > > Subject: Re: Can Dispatch API be used with jaxws:client Spring > > > configuration? > > > > > > > > > This SHOULD be working. > > > > > > Line 610 of ServiceImpl.java calls off to the configureObject with > > > the > > > right name, so it should be configuring in the features and then > > > copying them over at line 621. Any chance you can debug through > > > that > > > code to see if anything looks strange? > > > > > > Dan > > > > > > On Thursday, August 18, 2011 3:11:40 PM Jesse Pangburn wrote: > > > > I'm trying to use the Spring jaxws:client configuration to put > > > > as > > > > much > > > > of > > > > the setup for my Dispatch API client into Spring as possible, > > > > but it > > > > seems to be ignoring it. > > > > > > > > The following is the code I'm using to setup the dispatch > > > > client: > > > > URL wsdlURL = new > > > > URL("file:/home/jpangburn/Desktop/IHE/XDSb.Support.Materials.v9/ > > > > wsdl > > > > /XDS .b_ DocumentRegistry.wsdl"); Service service = > > > > Service.create(wsdlURL, new QName("urn:ihe:iti:xds-b:2007", > > > > "DocumentRegistry_Service")); Dispatch<StaxSource> disp = > > > > service.createDispatch(new > > > > QName("urn:ihe:iti:xds-b:2007", "DocumentRegistry_Port_Soap12"), > > > > StaxSource.class, Service.Mode.PAYLOAD); > > > > > > > > So the port is > > > > "{urn:ihe:iti:xds-b:2007}DocumentRegistry_Port_Soap12". > > > > In my Spring configuration I've tried this: <jaxws:client > > > > id="registryClient" > > > > name="{urn:ihe:iti:xds-b:2007}DocumentRegistry_Port_Soap12" > > > > address="http://localhost:30320/tf6/services/xdsregistryb" > > > > > > > > xmlns:ihe="urn:ihe:iti:xds-b:2007" > > > > > > > > endpointName="ihe:DocumentRegistry_Port_Soap12" > > > > serviceName="ihe:DocumentRegistry_Service" > > > > > > > > createdFromAPI="true"> > > > > <jaxws:features> > > > > > > > > <wsa:addressing > > > > xmlns:wsa="http://cxf.apache.org/ws/addressing"/> > > > > > > > > </jaxws:features> > > > > > > > > </jaxws:client> > > > > > > > > At first I hoped the "name" attribute would cause the matching > > > > at it > > > > would pick up my "address" attribute to set the destination > > > > address > > > > and > > > > my wsa:addressing feature to enable ws-addressing. It did not, > > > > just > > > > sent to the same url defined in the WSDL. So I added the > > > > endpointName > > > > and serviceName attributes, which also didn't help. Then I > > > > added > > > > "createdFromAPI" which didn't do anything either. > > > > > > > > I know the Spring configuration is working to some degree > > > > because if > > > > I > > > > put in a http:conduit that works just fine: <http:conduit > > > > name="{urn:ihe:iti:xds-b:2007}DocumentRegistry_Port_Soap12.http- > > > > cond > > > > uit" > > > > > > > > <http:tlsClientParameters disableCNCheck="true"> > > > > > > > > ... > > > > > > > > Is jaxws:client configuration just not related to the Dispatch > > > > API > > > > at > > > > all? If so, why not? This seems like it would be a nice way to > > > > setup > > > > address overrides, turn on/off jaxws:features, logging, > > > > interceptors, > > > > etc. for the Dispatch API. > > > > > > > > Thanks, > > > > Jesse -- Daniel Kulp [email protected] http://dankulp.com/blog Talend - http://www.talend.com
