I experimented a bit, checked few options and finally made it. That's the
final solution that works nicely and can be done in
BeanFactoryPostProcessor:

import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.jaxws.JAXWSMethodInvoker;
import org.apache.cxf.service.invoker.SpringBeanFactory;

//...

        Bus bus = beanFactory.getBean(Bus.DEFAULT_BUS_ID, Bus.class);
        EndpointImpl endpoint = new EndpointImpl(bus, null);
        endpoint.setImplementorClass(beanClass);
        endpoint.setInvoker(new JAXWSMethodInvoker(new
SpringBeanFactory(beanName)));

This way the service is never instantiated if not called. Every time the
service is called SpringBeanFactory retrieves a service object from Spring
context - which is what we want in Spring integration.

Thanks for you inputs!

Cheers,
Przemyslaw



On Tue, Jan 21, 2014 at 9:09 PM, Daniel Kulp [via CXF] <
[email protected]> wrote:

>
> What happens if you pass “null” in for the implementor bean?   Looking at
> the code, that LOOKS like it should work as there are “if (implementor ==
> null)” type checks all over the place.   Maybe we’re missing one someplace.
>
> That said, normally we would suggest using the JaxWsServerFactoryBean
> instead of creating an EndpointImpl unless you really need the EndpointImpl
> object for some reason.
>
> Dan
>
>
>
> On Jan 21, 2014, at 5:20 AM, Przemysław Bielicki <[hidden 
> email]<http://user/SendEmail.jtp?type=node&node=5738935&i=0>>
> wrote:
>
> > Hi Guys,
> >
> > I need your help. I moved along with my Spring integration and the code
> I
> > showed you works fine but only for Spring beans that are Singletons
> > (because they are eagerly created by Spring during the initialization).
> >
> > The problem starts when we have @WebService classes that are stateful
> (in a
> > sense that they are of "prototype" scope). It means that Spring does not
> > instantiates then automatically - only on demand. That's why  usage of
> > BeanPostProcessor is not possible. I have to use
> BeanFactoryPostProcessor.
> > So far, so good. What do I do? I do almost the same thing as before:
> >
> >  public void postProcessBeanFactory(ConfigurableListableBeanFactory
> > beanFactory) throws BeansException {
> >    for (String beanName : beanFactory.getBeanDefinitionNames()) {
> >      BeanDefinition beanDefinition =
> > beanFactory.getBeanDefinition(beanName);
> >
> >     // ... details
> >
> >      if (isWebService(beanClass)) {
> >        Bus bus = beanFactory.getBean(Bus.DEFAULT_BUS_ID, Bus.class);
> >        EndpointImpl endpoint = new EndpointImpl(bus,
> > *beanFactory.getBean(beanName)*, new SpringServerFactoryBean(beanName));
> >        endpoint.setAddress(blahblah);
> >        endpoint.getInInterceptors().addAll(blahblah);
> >        endpoint.getOutInterceptors().addAll(blahblah);
> >        bus.setExtension(blahblah);
> >        endpoint.publish();
> >    }
> >
> > But now I have to tell CXF how to obtain an instance of the service when
> > there is a client call. I do it passing SpringServerFactoryBean that
> knows
> > how to get the service object from Spring context.
> > SpringServerFactoryBean is my own simple class that instantiates web
> > service object on demand:
> >
> > import org.apache.cxf.jaxws.JAXWSMethodInvoker;
> > import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
> > import org.apache.cxf.service.invoker.Invoker;
> > import org.apache.cxf.service.invoker.SpringBeanFactory;
> >
> > public class SpringServerFactoryBean extends JaxWsServerFactoryBean {
> >
> >  private final String beanName;
> >
> >  public SpringServerFactoryBean(String beanName) {
> >    this.beanName = beanName;
> >  }
> >
> >  @Override
> >  protected Invoker createInvoker() {
> >    return new JAXWSMethodInvoker(new SpringBeanFactory(beanName));
> >  }
> > }
> >
> > It would fly and work nicely but there is one big issue with
> > org.apache.cxf.jaxws.EndpointImpl.
> > Why does it need an implementor object? To publish the service you don't
> > need the implementation instance - you need just a class metadata to
> check
> > what methods are public, what are their parameters, etc. This is big
> issue
> > because in BeanFactoryPostProcessor you are allowed to call
> > *beanFactory.getBean(beanName).
> > *
> >
> > Is it possible to modify or extend EndpointImpl so that it does not need
> > the implementor? It is able to get the implementor later (when it's
> really
> > needed) using JaxWsServerFactoryBean.
> >
> > I'm not sure my problem is clear enough. If not I'm eager to explain in
> > details.
> >
> > Best regards,
> > Przemyslaw
> >
> >
> > On Mon, Dec 9, 2013 at 4:50 PM, Przemysław Bielicki <[hidden 
> > email]<http://user/SendEmail.jtp?type=node&node=5738935&i=1>>wrote:
>
> >
> >> I just created a jira issue:
> >> https://issues.apache.org/jira/browse/CXF-5448
> >>
> >> I hope it's clear.
> >>
> >> Cheers,
> >> Przemyslaw
> >>
> >>
> >> On Mon, Dec 9, 2013 at 3:14 PM, cschneider [via CXF] <
> >> [hidden email] <http://user/SendEmail.jtp?type=node&node=5738935&i=2>>
> wrote:
> >>
> >>> We have some factory classes but they are often not as convenient to
> use
> >>> as the namespaces.
> >>>
> >>> In any case it would be interesting to see what you did. Can you open
> a
> >>> jira and attach your code as a patch?
> >>> If it is just a few lines you can also just paste the code or point to
> a
> >>> github repo or similar.
> >>>
> >>> Christian
> >>>
> >>> On 09.12.2013 15:05, pbielicki wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> in order to integrate CXF with Spring developers need to go through
> an
> >>> XML
> >>>> file, right (i.e.
> >>>> http://cxf.apache.org/docs/writing-a-service-with-spring.html)?
> >>>>
> >>>> Is it possible out-of-the box to integrate CXF with Spring using
> >>>> annotation-driven context configuration? I am talking about
> >>>> @org.springframework.context.annotation.Configuration and
> >>>> @org.springframework.context.annotation.ComponentScan annotations
> >>>> (
> >>>
> http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/context/annotation/Configuration.html).
>
> >>>
> >>>> Are they supported by CXF integration?
> >>>>
> >>>> The goal is to avoid any XML configuration.
> >>>>
> >>>> If it's not part of CXF I may help because I just implemented such
> >>>> integration (few lines of code, really), and I find it pretty useful.
> >>>>
> >>>> Please let me know what you think? I wanted to open a JIRA issue
> >>> straight
> >>>> away but I prefer to ask you before.
> >>>>
> >>>> Cheers,
> >>>> Przemyslaw Bielicki
> >>>>
> >>>>
> >>>>
> >>>> --
> >>>> View this message in context:
> >>>
> http://cxf.547215.n5.nabble.com/Spring-integration-using-Configuration-ComponentScan-annotations-tp5737561.html
> >>>> Sent from the cxf-dev mailing list archive at Nabble.com.
> >>>
> >>>
> >>> --
> >>> Christian Schneider
> >>> http://www.liquid-reality.de
> >>>
> >>> Open Source Architect
> >>> http://www.talend.com
> >>>
> >>>
> >>>
> >>> ------------------------------
> >>> If you reply to this email, your message will be added to the
> >>> discussion below:
> >>>
> >>>
> http://cxf.547215.n5.nabble.com/Spring-integration-using-Configuration-ComponentScan-annotations-tp5737561p5737562.html
> >>> To unsubscribe from Spring integration using @Configuration &
> >>> @ComponentScan annotations, click here<
>
> >>> .
> >>> NAML<
> http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>
> >>>
> >>
> >>
>
> --
> Daniel Kulp
> [hidden email] <http://user/SendEmail.jtp?type=node&node=5738935&i=3> -
> http://dankulp.com/blog
>
> Talend Community Coder - http://coders.talend.com
>
>
>
> ------------------------------
>  If you reply to this email, your message will be added to the discussion
> below:
>
> http://cxf.547215.n5.nabble.com/Spring-integration-using-Configuration-ComponentScan-annotations-tp5737561p5738935.html
>  To unsubscribe from Spring integration using @Configuration &
> @ComponentScan annotations, click 
> here<http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5737561&code=cGJpZWxpY2tpQGdtYWlsLmNvbXw1NzM3NTYxfC0xODU3NDYzNDAz>
> .
> NAML<http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>




--
View this message in context: 
http://cxf.547215.n5.nabble.com/Spring-integration-using-Configuration-ComponentScan-annotations-tp5737561p5738945.html
Sent from the cxf-dev mailing list archive at Nabble.com.

Reply via email to