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.ServiceRegistrationImpl.
> getReferenceImpl(ServiceRegistrationImpl.java:285)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.
> 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$
> ServiceRegistrationChangeCounter.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(
> ServiceReferenceOSGi.java:74)
> at org.apache.aries.component.dsl.internal.ServiceReferenceOSGi$
> DefaultServiceTrackerCustomizer.addingService(
> ServiceReferenceOSGi.java:56)
> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(
> ServiceTracker.java:941)
> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(
> ServiceTracker.java:1)
> at org.osgi.util.tracker.AbstractTracked.trackAdding(
> AbstractTracked.java:256)
> at org.osgi.util.tracker.AbstractTracked.trackInitial(
> AbstractTracked.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$
> create$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$
> create$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$
> create$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$
> create$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(OSGi.java:581)
> at org.apache.aries.component.dsl.internal.OSGiImpl.lambda$
> create$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$
> create$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$
> create$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(
> ServiceReferenceOSGi.java:74)
> at org.apache.aries.component.dsl.internal.ServiceReferenceOSGi$
> DefaultServiceTrackerCustomizer.addingService(
> ServiceReferenceOSGi.java:56)
> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(
> ServiceTracker.java:941)
> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(
> ServiceTracker.java:1)
> at org.osgi.util.tracker.AbstractTracked.trackAdding(
> AbstractTracked.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.FilteredServiceListener.
> serviceChanged(FilteredServiceListener.java:109)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(
> BundleContextImpl.java:920)
> at org.eclipse.osgi.framework.eventmgr.EventManager.
> dispatchEvent(EventManager.java:230)
> at org.eclipse.osgi.framework.eventmgr.ListenerQueue.
> dispatchEventSynchronous(ListenerQueue.java:148)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.
> publishServiceEventPrivileged(ServiceRegistry.java:862)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.
> publishServiceEvent(ServiceRegistry.java:801)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.
> register(ServiceRegistrationImpl.java:127)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.
> registerService(ServiceRegistry.java:225)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(
> BundleContextImpl.java:469)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(
> BundleContextImpl.java:487)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(
> BundleContextImpl.java:1004)
> at org.ops4j.pax.web.extender.whiteboard.internal.
> ExtendedHttpServiceRuntime.registerService(ExtendedHttpServiceRuntime.
> java:144)
> at org.ops4j.pax.web.extender.whiteboard.internal.
> ExtendedHttpServiceRuntime.serviceChanged(ExtendedHttpServiceRuntime.
> java:116)
> at org.ops4j.pax.web.extender.whiteboard.internal.
> ExtendedHttpServiceRuntime.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.customizerAdding(
> ServiceTracker.java:941)
> at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(
> ServiceTracker.java:1)
> at org.osgi.util.tracker.AbstractTracked.trackAdding(
> AbstractTracked.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.FilteredServiceListener.
> serviceChanged(FilteredServiceListener.java:109)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(
> BundleContextImpl.java:920)
> at org.eclipse.osgi.framework.eventmgr.EventManager.
> dispatchEvent(EventManager.java:230)
> at org.eclipse.osgi.framework.eventmgr.ListenerQueue.
> dispatchEventSynchronous(ListenerQueue.java:148)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.
> publishServiceEventPrivileged(ServiceRegistry.java:862)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.
> publishServiceEvent(ServiceRegistry.java:801)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.
> register(ServiceRegistrationImpl.java:127)
> at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.
> registerService(ServiceRegistry.java:225)
> at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(
> BundleContextImpl.java:469)
> at org.ops4j.pax.web.service.internal.Activator.
> updateController(Activator.java:399)
> at org.ops4j.pax.web.service.internal.Activator.lambda$
> scheduleUpdateFactory$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/
> wiki/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)

Reply via email to