That worked! Thanks again. By the way, how are you determining which Bus to use? I used BusFactory.getDefaultBus(true).
On Sun, Mar 6, 2016 at 5:48 PM James Carman <[email protected]> wrote: > This should work very well! Thank you so much! I'll code it up tonight. I > will write an open source version of this in the very near future > On Sun, Mar 6, 2016 at 5:45 PM Benson Margulies <[email protected]> > wrote: > >> On Sun, Mar 6, 2016 at 5:18 PM, James Carman <[email protected]> >> wrote: >> > It's karaf. I'm building a service that looks up at runtime the >> > configuration of the services and then "exports" them accordingly. I'd >> like >> > to support exporting via CXF and was looking for inspiration. >> > On Sun, Mar 6, 2016 at 5:16 PM Benson Margulies <[email protected]> >> >> I had built what you describe (DS component that had a >> multiple-cardinality reference that collected resources, and then set >> up a CXF service), but it could never work out the timing of startup. >> So, instead, I allow each service to export itself. The base class of >> all the services has the following. The depends on having the latest >> SCR from 4.0.4 and the following maven-bundle-plugin options. >> >> <_dsannotations>*</_dsannotations> >> <_dsannotations-options>inherit</_dsannotations-options> >> >> ...... >> >> >> /** >> * Start the service. >> * @param resourcePath the resource path. >> */ >> protected void startService(String resourcePath) { >> >> JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); >> // Setting the bus ensures that the TCCL is this bundle when our >> resource classes are called. >> sf.setBus(cxfBus.bus()); >> sf.setProvider(new >> JacksonJaxbJsonProvider(JsonUtils.getObjectMapper(), >> JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS)); >> sf.setProvider(new JsonExceptionMapper()); >> sf.setProvider(new WebApplicationExceptionMapper()); >> sf.setProvider(new GenericExceptionMapper()); >> sf.setServiceBeans(Collections.singletonList(this)); >> >> String url = sharedService.getUrlPathPrefix() + resourcePath; >> LOG.info(String.format("%s at %s", getClass().getName(), url)); >> sf.setAddress(url); >> server = sf.create(); >> } >> >> @Activate >> public void activate(ComponentContext context) { >> LOG.info("Activating " + getClass().getName()); >> startService(getPath()); >> } >> >> @Deactivate >> public void shutdown() { >> if (server != null) { >> server.destroy(); >> server = null; >> } >> } >> >
