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 <raymond.a...@liferay.com>
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 <n...@benchmarkconsulting.com
> > 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/pax/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.
>> updateProperty(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.
>> lambda$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(OSGiImpl.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(OSGiImpl.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(OSGiImpl.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(OSGiImpl.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(OSGiImpl.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(OSGiImpl.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(OSGiImpl.java:50)
>> at org.apache.aries.component.dsl.internal.IgnoreImpl.lambda$
>> new$1(IgnoreImpl.java:29)
>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImpl.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(OSGiImpl.java:50)
>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImpl.java:44)
>> at org.apache.aries.jax.rs.whiteboard.internal.Whiteboard.
>> start(Whiteboard.java:184)
>> at org.apache.aries.component.dsl.internal.EffectsOSGi.lambda$
>> new$1(EffectsOSGi.java:30)
>> at org.apache.aries.component.dsl.internal.OSGiImpl.run(OSGiImpl.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(OSGiImpl.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(OSGiImpl.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(OSGiImpl.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(OSGiImpl.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 Ouest, Suite 613
Montréal, Québec H3B-1A7
(514) 360-7208 o
(514) 798-2044 f
n...@castortech.com
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.

Reply via email to