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 <[email protected]>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] <
> [email protected]> 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<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>
>>
>
>