[ 
https://issues.apache.org/jira/browse/CXF-5448?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13844059#comment-13844059
 ] 

Przemyslaw Bielicki commented on CXF-5448:
------------------------------------------

@Christian - I see your point - it's totally valid. As I said my use case is 
quite simple (but it will be getting more complex in the future, I suppose)
I'm not able to "fix" this implementation as I have no complete knowledge on 
which elements should / should not be customizable. I suppose that CXF should 
offer the same flexibility to end developers, no matter whether they use XML or 
annotations. You could also think of keeping the simplest implementations (like 
the one I presented) for really simple cases - but limitations and risks (e.g. 
ALL features registered in Spring context will be added to all JAX-WS 
postprocessed - not sure devs would want that in all cases) should be 
documented well.

@Sergey - I'm not sure I understood your question bet let me answer anyway. If 
you know the name of the bean you want to use you can simply indicate it next 
to @Inject annotation (you can also check javadoc for @javax.inject.Qualifier - 
it might be useful):
{code:java}
@Inject @Named("myInterceptor") InInterceptor inInterceptor;
{code}

Please let me know if my answers are clear enough.

> Spring integration via @Configuration & @ComponentScan annotations
> ------------------------------------------------------------------
>
>                 Key: CXF-5448
>                 URL: https://issues.apache.org/jira/browse/CXF-5448
>             Project: CXF
>          Issue Type: Improvement
>          Components: Integration
>    Affects Versions: 2.6.11
>            Reporter: Przemyslaw Bielicki
>            Priority: Minor
>
> Hi,
> as per dev mailing list thread started by me 
> http://mail-archives.apache.org/mod_mbox/cxf-dev/201312.mbox/%[email protected]%3e
>  I would like to share my solution to get rid of XML file with CXF services 
> definition.
> My case is rather simple (read: uncomplete) as I just want to automatically 
> register in CXF @WebService and @WebServiceProvider annotated classes, so 
> that they are exposed via CXFServlet.
> The end developer just needs to annotate her services with e.g. @WebService 
> annotation and also needs to add a following Spring configuration 
> (application code):
> {code:title=SampleAppConfig.java|borderStyle=solid}
> import javax.jws.WebService;
> import javax.xml.ws.WebServiceProvider;
> import org.springframework.context.annotation.ComponentScan;
> import org.springframework.context.annotation.ComponentScan.Filter;
> import org.springframework.context.annotation.Configuration;
> import org.springframework.context.annotation.Import;
> @Configuration
> @Import(JaxWsConfig.class)
> @ComponentScan(value = { "package filters" },
>     includeFilters = { 
>       @Filter(WebService.class), 
>       @Filter(WebServiceProvider.class) 
>     })
> public class SampleAppConfig {
> }
> {code}
> where JaxWsConfig is a reference to CXF Spring configuration (it should be a 
> part of CXF):
> {code:title=JaxWsConfig.java|borderStyle=solid}
> @Configuration
> @ImportResource({ 
>   "classpath:META-INF/cxf/cxf.xml", 
>   "classpath:META-INF/cxf/cxf-servlet.xml" 
>   })
> public class JaxWsConfig {
> }
> {code}
> The crucial part is Spring bean post processor (that should be also a part of 
> CXF distribution):
> {code:title=JaxWsBeanPostProcessor.java|borderStyle=solid}
> @Named
> public class JaxWsBeanPostProcessor implements BeanPostProcessor {
>   @Inject
>   ListableBeanFactory beanFactory;
>   
>   @Override
>   public Object postProcessBeforeInitialization(Object bean, String beanName) 
> throws BeansException {
>     return bean;
>   }
>   @Override
>   public Object postProcessAfterInitialization(Object bean, String beanName) 
> throws BeansException {
>       if (isWebService(bean)) {
>         Bus bus = beanFactory.getBean(Bus.DEFAULT_BUS_ID, Bus.class);
>         SpringEndpointImpl endpoint = new SpringEndpointImpl(bus, bean);
>         // capitalization is just a nice feature - totally optional
>         endpoint.setAddress("/" + StringUtils.capitalize(beanName));
>         // adds ALL features registered / discovered by Spring
>         Map<String, AbstractFeature> featureMap = 
> beanFactory.getBeansOfType(AbstractFeature.class);
>         endpoint.getFeatures().addAll(featureMap.values());
>         endpoint.publish();
>       }
>       
>       return bean;
>   }
>   boolean isWebService(Object bean) {
>     Class<?> beanClass = bean.getClass();
>     return beanClass.getAnnotation(WebService.class) != null
>         || beanClass.getAnnotation(WebServiceProvider.class) != null;
>   }
> }
> {code}
> And then if you also want to configure / inject your features using CDI 
> (Spring) you do stuff like this (application code):
> {code:title=MyFeature.java|borderStyle=solid}
> @Named
> public class MyFeature extends AbstractFeature {
>   
>   @Inject
>   MyInInterceptor inInterceptor;
>   @Inject
>   MyOutInterceptor outInterceptor;
>   @Override
>   protected void initializeProvider(InterceptorProvider provider, Bus bus) {
>     processedBus.put(bus, Boolean.TRUE);
>     bus.getInInterceptors().add(inInterceptor);
>     bus.getOutInterceptors().add(outInterceptor);
>   }
> {code}
> Does that make sense?
> Please note that my implementation is simplified but works for me. You should 
> probably add all other possible customizations in JaxWsBeanPostProcessor 
> class.



--
This message was sent by Atlassian JIRA
(v6.1.4#6159)

Reply via email to