Then bind to specific path in each bundle! It's perfectly fine to specify a full path in the pattern. If each is unique there is no trouble. if they are not, then only the "best" (as in natural service ordering) will be served.
- Ray On Thu, Sep 6, 2018 at 11:58 AM, Nhut Thai Le <[email protected]> wrote: > Thank you for your suggestion, however, that approach binds a patterns to > one resource location only. I have few bundles, each have an icons folders > that need to be served with the same pattern /icons/*. The reason for this > is that the url to the static resources (icons) are dynamically generated > and the generator does not know in advance which bundle should provides the > icon so it just generated something like "http://mysite.com/icons/car.png > ". > > Thai > > > > On Thu, Sep 6, 2018 at 10:05 AM, Raymond Auge <[email protected]> > wrote: > >> You don't need any extra bundles to serve static resources because Aries >> JAX-RS whiteboard is built using Http Whiteboard which means that all you >> need to serve your static resources is to place them in a bundle with the >> following component: >> >> @Component( >> property= { >> "osgi.http.whiteboard.resource.pattern=/static/*", >> "osgi.http.whiteboard.resource.prefix=/path/in/bundle/to/ >> static/resources" >> }, >> service = Resources.class >> ) >> public Resources {} >> >> See https://osgi.org/specification/osgi.cmpn/7.0.0/service.http. >> whiteboard.html#d0e121459 >> >> - Ray >> >> On Wed, Sep 5, 2018 at 7:23 PM, Nhut Thai Le < >> [email protected]> wrote: >> >>> Hello, >>> >>> I'm using aries-jax-rs-whiteboard to host my REST api as follow: >>> --------the app >>> @Component( >>> service = Application.class, >>> property= { >>> "osgi.jaxrs.name=RestApp", >>> JAX_RS_APPLICATION_BASE + "=/rest", >>> "authentication.with=keycloak" >>> } >>> ) >>> public class RestApiApp extends Application{ >>> >>> @Override >>> public Set<Object> getSingletons() { >>> return Collections.singleton(this); >>> } >>> } >>> -------the resource >>> @Component( >>> service = Api.class, >>> property = { >>> "osgi.jaxrs.name=RestApi", >>> "osgi.jaxrs.resource=true", >>> "osgi.jaxrs.application.select=(osgi.jaxrs.name=RestApp)" >>> } >>> ) >>> @Path("/object") >>> public final class Api { >>> public static final Response EMPTY_RESPONSE = >>> Response.noContent().type(MediaType.TEXT_HTML_TYPE).build(); >>> @GET >>> @Path("/getObject") >>> @Produces(MediaType.APPLICATION_JSON) >>> public String getObject() { >>> //return some json >>> } >>> } >>> >>> The API works fine, now i need to add a jetty handler to return some >>> static js and icon, so in the Activator of my bundle, i add: >>> ResourceHandler bootstrapResource = new ResourceHandler(); >>> bootstrapResource.setResourceBase("bootstrap"); >>> bootstrapResource.setDirectoriesListed(true); >>> ContextHandler bootstrapContext = new ContextHandler(); >>> bootstrapContext.setContextPath("bootstrap"); >>> bootstrapContext.setHandler(bootstrapResource); >>> bootstrapResourceHandler = context.registerService(Handler.class, >>> bootstrapContext, null); >>> >>> This code is from http://ops4j.github.io/pa >>> x/web/SNAPSHOT/User-Guide.html#advanced-jetty-configuration >>> >>> Now when i start the server i got this error: >>> !ENTRY org.apache.aries.jax.rs.whiteboard 4 0 2018-09-05 19:13:20.976 >>> !MESSAGE FrameworkEvent ERROR >>> !STACK 0 >>> java.lang.IllegalStateException: The service has been unregistered >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistratio >>> nImpl.getReferenceImpl(ServiceRegistrationImpl.java:285) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistratio >>> nImpl.getReference(ServiceRegistrationImpl.java:274) >>> at org.apache.aries.jax.rs.whiteboard.internal.utils.Utils.upda >>> teProperty(Utils.java:188) >>> at org.apache.aries.jax.rs.whiteboard.internal.Whiteboard$Servi >>> ceRegistrationChangeCounter.inc(Whiteboard.java:1318) >>> at org.apache.aries.jax.rs.whiteboard.internal.Whiteboard.lambd >>> a$countChanges$88(Whiteboard.java:1148) >>> at org.apache.aries.component.dsl.OSGi.lambda$null$69(OSGi.java:614) >>> at org.apache.aries.component.dsl.Publisher.apply(Publisher.java:28) >>> at org.apache.aries.component.dsl.OSGi.lambda$null$71(OSGi.java:682) >>> at org.apache.aries.component.dsl.Publisher.apply(Publisher.java:28) >>> at org.apache.aries.component.dsl.internal.ServiceReferenceOSGi >>> $DefaultServiceTrackerCustomizer.addingService(ServiceRefere >>> nceOSGi.java:74) >>> at org.apache.aries.component.dsl.internal.ServiceReferenceOSGi >>> $DefaultServiceTrackerCustomizer.addingService(ServiceRefere >>> nceOSGi.java:56) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAddin >>> g(ServiceTracker.java:941) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAddin >>> g(ServiceTracker.java:1) >>> at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTr >>> acked.java:256) >>> at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractT >>> racked.java:183) >>> at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:318) >>> at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:261) >>> at org.apache.aries.component.dsl.internal.ServiceReferenceOSGi >>> .lambda$new$0(ServiceReferenceOSGi.java:50) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$filter$72(OSGi.java:678) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$crea >>> te$0(OSGiImpl.java:39) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$effects$70(OSGi.java:611) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$crea >>> te$0(OSGiImpl.java:39) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.internal.AllOSGi.lambda$null$ >>> 0(AllOSGi.java:40) >>> at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) >>> at java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown >>> Source) >>> at java.util.stream.AbstractPipeline.copyInto(Unknown Source) >>> at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) >>> at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown >>> Source) >>> at java.util.stream.AbstractPipeline.evaluate(Unknown Source) >>> at java.util.stream.ReferencePipeline.collect(Unknown Source) >>> at org.apache.aries.component.dsl.internal.AllOSGi.lambda$new$2 >>> (AllOSGi.java:41) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$splitBy$87(OSGi.java:749) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$crea >>> te$0(OSGiImpl.java:39) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$effects$70(OSGi.java:611) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$crea >>> te$0(OSGiImpl.java:39) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$distribute$65(OSG >>> i.java:581) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$crea >>> te$0(OSGiImpl.java:39) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.internal.IgnoreImpl.lambda$ne >>> w$1(IgnoreImpl.java:29) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.internal.AllOSGi.lambda$null$ >>> 0(AllOSGi.java:40) >>> at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) >>> at java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown >>> Source) >>> at java.util.stream.AbstractPipeline.copyInto(Unknown Source) >>> at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) >>> at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown >>> Source) >>> at java.util.stream.AbstractPipeline.evaluate(Unknown Source) >>> at java.util.stream.ReferencePipeline.collect(Unknown Source) >>> at org.apache.aries.component.dsl.internal.AllOSGi.lambda$new$2 >>> (AllOSGi.java:41) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:44) >>> at org.apache.aries.jax.rs.whiteboard.internal.Whiteboard.start >>> (Whiteboard.java:184) >>> at org.apache.aries.component.dsl.internal.EffectsOSGi.lambda$n >>> ew$1(EffectsOSGi.java:30) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.internal.AllOSGi.lambda$null$ >>> 0(AllOSGi.java:40) >>> at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) >>> at java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown >>> Source) >>> at java.util.stream.AbstractPipeline.copyInto(Unknown Source) >>> at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) >>> at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown >>> Source) >>> at java.util.stream.AbstractPipeline.evaluate(Unknown Source) >>> at java.util.stream.ReferencePipeline.collect(Unknown Source) >>> at org.apache.aries.component.dsl.internal.AllOSGi.lambda$new$2 >>> (AllOSGi.java:41) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$null$73(OSGi.java:693) >>> at org.apache.aries.component.dsl.OSGi.lambda$null$69(OSGi.java:617) >>> at org.apache.aries.component.dsl.Publisher.apply(Publisher.java:28) >>> at org.apache.aries.component.dsl.Publisher.apply(Publisher.java:25) >>> at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) >>> at java.util.Collections$2.tryAdvance(Unknown Source) >>> at java.util.Collections$2.forEachRemaining(Unknown Source) >>> at java.util.stream.AbstractPipeline.copyInto(Unknown Source) >>> at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) >>> at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown >>> Source) >>> at java.util.stream.AbstractPipeline.evaluate(Unknown Source) >>> at java.util.stream.ReferencePipeline.collect(Unknown Source) >>> at org.apache.aries.component.dsl.internal.JustOSGiImpl.lambda$ >>> new$2(JustOSGiImpl.java:42) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$effects$70(OSGi.java:611) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$crea >>> te$0(OSGiImpl.java:39) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$flatMap$74(OSGi.java:693) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$crea >>> te$0(OSGiImpl.java:39) >>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImp >>> l.java:50) >>> at org.apache.aries.component.dsl.OSGi.lambda$null$73(OSGi.java:693) >>> at org.apache.aries.component.dsl.Publisher.apply(Publisher.java:28) >>> at org.apache.aries.component.dsl.internal.ServiceReferenceOSGi >>> $DefaultServiceTrackerCustomizer.addingService(ServiceRefere >>> nceOSGi.java:74) >>> at org.apache.aries.component.dsl.internal.ServiceReferenceOSGi >>> $DefaultServiceTrackerCustomizer.addingService(ServiceRefere >>> nceOSGi.java:56) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAddin >>> g(ServiceTracker.java:941) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAddin >>> g(ServiceTracker.java:1) >>> at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTr >>> acked.java:256) >>> at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged( >>> ServiceTracker.java:901) >>> at org.eclipse.osgi.internal.serviceregistry.FilteredServiceLis >>> tener.serviceChanged(FilteredServiceListener.java:109) >>> at org.eclipse.osgi.internal.framework.BundleContextImpl.dispat >>> chEvent(BundleContextImpl.java:920) >>> at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEve >>> nt(EventManager.java:230) >>> at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEv >>> entSynchronous(ListenerQueue.java:148) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.pu >>> blishServiceEventPrivileged(ServiceRegistry.java:862) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.pu >>> blishServiceEvent(ServiceRegistry.java:801) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistratio >>> nImpl.register(ServiceRegistrationImpl.java:127) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.re >>> gisterService(ServiceRegistry.java:225) >>> at org.eclipse.osgi.internal.framework.BundleContextImpl.regist >>> erService(BundleContextImpl.java:469) >>> at org.eclipse.osgi.internal.framework.BundleContextImpl.regist >>> erService(BundleContextImpl.java:487) >>> at org.eclipse.osgi.internal.framework.BundleContextImpl.regist >>> erService(BundleContextImpl.java:1004) >>> at org.ops4j.pax.web.extender.whiteboard.internal.ExtendedHttpS >>> erviceRuntime.registerService(ExtendedHttpServiceRuntime.java:144) >>> at org.ops4j.pax.web.extender.whiteboard.internal.ExtendedHttpS >>> erviceRuntime.serviceChanged(ExtendedHttpServiceRuntime.java:116) >>> at org.ops4j.pax.web.extender.whiteboard.internal.ExtendedHttpS >>> erviceRuntime.serviceChanged(ExtendedHttpServiceRuntime.java:44) >>> at org.ops4j.pax.web.extender.whiteboard.internal.util.tracker. >>> ReplaceableService.bind(ReplaceableService.java:86) >>> at org.ops4j.pax.web.extender.whiteboard.internal.util.tracker. >>> ReplaceableService$Customizer.addingService(ReplaceableService.java:105) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAddin >>> g(ServiceTracker.java:941) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAddin >>> g(ServiceTracker.java:1) >>> at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTr >>> acked.java:256) >>> at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) >>> at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged( >>> ServiceTracker.java:901) >>> at org.eclipse.osgi.internal.serviceregistry.FilteredServiceLis >>> tener.serviceChanged(FilteredServiceListener.java:109) >>> at org.eclipse.osgi.internal.framework.BundleContextImpl.dispat >>> chEvent(BundleContextImpl.java:920) >>> at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEve >>> nt(EventManager.java:230) >>> at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEv >>> entSynchronous(ListenerQueue.java:148) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.pu >>> blishServiceEventPrivileged(ServiceRegistry.java:862) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.pu >>> blishServiceEvent(ServiceRegistry.java:801) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistratio >>> nImpl.register(ServiceRegistrationImpl.java:127) >>> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.re >>> gisterService(ServiceRegistry.java:225) >>> at org.eclipse.osgi.internal.framework.BundleContextImpl.regist >>> erService(BundleContextImpl.java:469) >>> at org.ops4j.pax.web.service.internal.Activator.updateControlle >>> r(Activator.java:399) >>> at org.ops4j.pax.web.service.internal.Activator.lambda$schedule >>> UpdateFactory$1(Activator.java:331) >>> at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) >>> at java.util.concurrent.FutureTask.run(Unknown Source) >>> at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) >>> at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) >>> at java.lang.Thread.run(Unknown Source) >>> >>> hence my API does not work anymore, sending request to the API endpoint >>> result in 404. >>> >>> I'm not sure if this has something to do with https://ops4j1.jira.com/w >>> iki/spaces/paxweb/pages/354025473/HTTP+Context+processing >>> >>> Does anyone have an idea what may happened and what can I do to fix >>> this? >>> >>> Thank you in advance >>> >>> Thai >>> >> >> >> >> -- >> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile> >> (@rotty3000) >> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com> >> (@Liferay) >> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org> >> (@OSGiAlliance) >> > > > > -- > Castor Technologies Inc > 460 rue St-Catherine St > <https://maps.google.com/?q=460+rue+St-Catherine+St&entry=gmail&source=g> > Ouest, Suite 613 > Montréal, Québec H3B-1A7 > (514) 360-7208 o > (514) 798-2044 f > [email protected] > www.castortech.com > > CONFIDENTIALITY NOTICE: The information contained in this e-mail is > confidential and may be proprietary information intended only for the use > of the individual or entity to whom it is addressed. If the reader of this > message is not the intended recipient, you are hereby notified that any > viewing, dissemination, distribution, disclosure, copy or use of the > information contained in this e-mail message is strictly prohibited. If you > have received and/or are viewing this e-mail in error, please immediately > notify the sender by reply e-mail, and delete it from your system without > reading, forwarding, copying or saving in any manner. Thank you. > AVIS DE CONFIDENTIALITE: L’information contenue dans ce message est > confidentiel, peut être protégé par le secret professionnel et est réservé > à l'usage exclusif du destinataire. Toute autre personne est par les > présentes avisée qu'il lui est strictement interdit de diffuser, distribuer > ou reproduire ce message. Si vous avez reçu cette communication par erreur, > veuillez la détruire immédiatement et en aviser l'expéditeur. Merci. > -- *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile> (@rotty3000) Senior Software Architect *Liferay, Inc.* <http://www.liferay.com> (@Liferay) Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org> (@OSGiAlliance)
