Return-Path: X-Original-To: apmail-cxf-issues-archive@www.apache.org Delivered-To: apmail-cxf-issues-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id D272E10FFB for ; Tue, 10 Dec 2013 08:45:20 +0000 (UTC) Received: (qmail 36693 invoked by uid 500); 10 Dec 2013 08:45:19 -0000 Delivered-To: apmail-cxf-issues-archive@cxf.apache.org Received: (qmail 36658 invoked by uid 500); 10 Dec 2013 08:45:18 -0000 Mailing-List: contact issues-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list issues@cxf.apache.org Received: (qmail 36623 invoked by uid 99); 10 Dec 2013 08:45:07 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 10 Dec 2013 08:45:07 +0000 Date: Tue, 10 Dec 2013 08:45:07 +0000 (UTC) From: "Przemyslaw Bielicki (JIRA)" To: issues@cxf.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (CXF-5448) Spring integration via @Configuration & @ComponentScan annotations MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/CXF-5448?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13844090#comment-13844090 ] Przemyslaw Bielicki commented on CXF-5448: ------------------------------------------ News is even better, I think. @Inject and other standard annotations will also work in any other CDI container, including Java EE containers. The only Spring specific part here is the @Configuration and bean post processor which will not be needed in Java EE managed environments (e.g. JBoss will publish all JAX-WS services automatically and it also support javax.inject annotations) > 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/%3c1386597934463-5737561.post@n5.nabble.com%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 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) { > 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)