It seems like a general problem and not just a Pax-Web problem. It is probably not possible to have two servlets with overlapping context paths. Although I think it should be possible if one could control the order in which they are invoked.
Strange, I would think that this would be a pretty normal thing. You seem to be very knowledgable about servlets. How does the actual invoking of a servlet work? Is it possible to have a chain where one servlet leaves the request unhandled to be passed on to the next? If not, then I guess it's Jetty internals that decide what servlet to invoke. Would a workaround be to move all my static files out of the bundle and not use the registerResources() method at all but only use jetty.xml and org.eclipse.jetty.server.handler.ResourceHandler. Would I loose any Pax-Web functionality this way? /Bengt 2016-11-10 15:35 GMT+01:00 'Achim Nierbeck' via OPS4J < [email protected]>: > ok, at least #1 is solved ... that one worried me. > > Using "/" for the HttpService in conjunction with aliases plus an extra > handler on the same context path ... seems hard to achieve. I fear we need > an issue for this. > Combining two handlers on the same context path seems to be a bit tricky > right now. > > regards, Achim > > > 2016-11-10 15:16 GMT+01:00 Bengt Rodehav <[email protected]>: > >> An update on this problem... >> >> Problem #1 was not a problem but a bug in my code. I created the "//" >> (double slash) all by myself. Sorry for the buzz. >> >> Problem #2 however still exists. If I register resources on the root url >> using >> >> mWebService.registerResources("/", "/webroot", mHttpContext); >> >> Then I cannot publish any resources using jetty.xml and >> org.eclipse.jetty.server.handler.ResourceHandler. >> >> Pax-Web's resource handler does not seem to pass the request on to the >> handler I register in jetty.xml. >> >> So my problem is that I need to accomplish both of these things at the >> same time: >> >> - Map "/logo" to a normal directory using jetty.xml and >> org.eclipse.jetty.server.handler.ResourceHandler >> - Map "/" to the "/webroot" directory in my bundle using the >> registerResources() method. >> >> How can I accomplish this? >> >> I did try to use "insertRule" in my jetty.xml instead of "addHandler" >> since I hoped that this would put the "/logo" rule first. However, this >> syntax does not seem to be supported. >> >> /Bengt >> >> 2016-11-09 8:58 GMT+01:00 Bengt Rodehav <[email protected]>: >> >>> OK - thanks. >>> >>> Finally got you :-) >>> >>> /Bengt >>> >>> 2016-11-08 21:27 GMT+01:00 'Achim Nierbeck' via OPS4J < >>> [email protected]>: >>> >>>> Hi >>>> >>>> regarding registering resources on "/" ... I'd expect it to work in the >>>> way you describe it, but you might have found a bug there. >>>> The thing about the "/" - context, is. It is special. Since all >>>> HttpService registered "resources" are registered with this as the context >>>> ... So it might be that an additional context from outside doesn't play >>>> along. Will need to test. >>>> >>>> regards, Achim >>>> >>>> >>>> 2016-11-08 8:58 GMT+01:00 Bengt Rodehav <[email protected]>: >>>> >>>>> Hi again Achim, >>>>> >>>>> I'm not exactly sure how you mean. The way I register my resources is >>>>> via the WebContainer (which I get with iPojo) as follows: >>>>> >>>>> private HttpContext mHttpContext; >>>>> >>>>> @Requires >>>>> private WebContainer mWebService; >>>>> ... >>>>> mHttpContext = mWebService.createDefaultHttpContext(); >>>>> mWebService.registerResources("/", "/webroot", mHttpContext); >>>>> >>>>> The above will get me the double slash problem. If I instead do: >>>>> >>>>> mWebService.registerResources("", "/webroot", mHttpContext); >>>>> >>>>> Then I get: >>>>> >>>>> Caused by: java.lang.IllegalArgumentException: Alias does not start >>>>> with slash (/) >>>>> at org.ops4j.pax.web.service.spi. >>>>> model.ServletModel.validateAlias(ServletModel.java:169) >>>>> at org.ops4j.pax.web.service.spi. >>>>> model.ServletModel.<init>(ServletModel.java:53) >>>>> at org.ops4j.pax.web.service.spi. >>>>> model.ResourceModel.<init>(ResourceModel.java:29) >>>>> at org.ops4j.pax.web.service.inte >>>>> rnal.HttpServiceStarted.registerResources(HttpServiceStarted.java:262) >>>>> at org.ops4j.pax.web.service.inte >>>>> rnal.HttpServiceProxy.registerResources(HttpServiceProxy.java:71) >>>>> at org.ops4j.pax.web.service.WebC >>>>> ontainer$$Proxy.registerResources(Unknown Source) >>>>> at se.digia.hp.web.HpWebService._ >>>>> _M_init(HpWebService.java:134) >>>>> at se.digia.hp.web.HpWebService.init(HpWebService.java) >>>>> at se.digia.hp.web.HpWebService._ >>>>> _M_starting(HpWebService.java:47) >>>>> at se.digia.hp.web.HpWebService.starting(HpWebService.java) >>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native >>>>> Method)[:1.8.0_74] >>>>> at sun.reflect.NativeMethodAccess >>>>> orImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_74] >>>>> at sun.reflect.DelegatingMethodAc >>>>> cessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_74] >>>>> at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_74] >>>>> at org.apache.felix.ipojo.util.Ca >>>>> llback.call(Callback.java:237)[50:org.apache.felix.ipojo:1.12.1] >>>>> at org.apache.felix.ipojo.util.Ca >>>>> llback.call(Callback.java:193)[50:org.apache.felix.ipojo:1.12.1] >>>>> at org.apache.felix.ipojo.handler >>>>> s.lifecycle.callback.LifecycleCallback.call(LifecycleCallbac >>>>> k.java:86)[50:org.apache.felix.ipojo:1.12.1] >>>>> at org.apache.felix.ipojo.handler >>>>> s.lifecycle.callback.LifecycleCallbackHandler.__M_stateChang >>>>> ed(LifecycleCallbackHandler.java:162)[50:org.apache.felix.i >>>>> pojo:1.12.1] >>>>> >>>>> Specifying null does not work either. If I do >>>>> >>>>> mWebService.registerResources(null, "/webroot", mHttpContext); >>>>> >>>>> Then I get: >>>>> >>>>> Caused by: java.lang.IllegalArgumentException: Alias does not start >>>>> with slash (/) >>>>> at org.ops4j.pax.web.service.spi. >>>>> model.ServletModel.validateAlias(ServletModel.java:169) >>>>> at org.ops4j.pax.web.service.spi. >>>>> model.ServletModel.<init>(ServletModel.java:53) >>>>> at org.ops4j.pax.web.service.spi. >>>>> model.ResourceModel.<init>(ResourceModel.java:29) >>>>> at org.ops4j.pax.web.service.inte >>>>> rnal.HttpServiceStarted.registerResources(HttpServiceStarted.java:262) >>>>> at org.ops4j.pax.web.service.inte >>>>> rnal.HttpServiceProxy.registerResources(HttpServiceProxy.java:71) >>>>> at org.ops4j.pax.web.service.WebC >>>>> ontainer$$Proxy.registerResources(Unknown Source) >>>>> at se.digia.hp.web.HpWebService._ >>>>> _M_init(HpWebService.java:134) >>>>> at se.digia.hp.web.HpWebService.init(HpWebService.java) >>>>> at se.digia.hp.web.HpWebService._ >>>>> _M_starting(HpWebService.java:47) >>>>> at se.digia.hp.web.HpWebService.starting(HpWebService.java) >>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native >>>>> Method)[:1.8.0_74] >>>>> at sun.reflect.NativeMethodAccess >>>>> orImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_74] >>>>> at sun.reflect.DelegatingMethodAc >>>>> cessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_74] >>>>> at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_74] >>>>> at org.apache.felix.ipojo.util.Ca >>>>> llback.call(Callback.java:237)[50:org.apache.felix.ipojo:1.12.1] >>>>> at org.apache.felix.ipojo.util.Ca >>>>> llback.call(Callback.java:193)[50:org.apache.felix.ipojo:1.12.1] >>>>> at org.apache.felix.ipojo.handler >>>>> s.lifecycle.callback.LifecycleCallback.call(LifecycleCallbac >>>>> k.java:86)[50:org.apache.felix.ipojo:1.12.1] >>>>> at org.apache.felix.ipojo.handler >>>>> s.lifecycle.callback.LifecycleCallbackHandler.__M_stateChang >>>>> ed(LifecycleCallbackHandler.java:162)[50:org.apache.felix.i >>>>> pojo:1.12.1] >>>>> >>>>> It looks like the code you are referring to registers a Servlet which >>>>> I do not do directly for these resources (although Pax-Web ResourceServlet >>>>> is probably used under the hood). >>>>> >>>>> Perhaps I'd better give you the overall picture... >>>>> >>>>> I have a web application consisting of html/javascript/css files. >>>>> These are included in my app and will reside in my bundle. They are >>>>> located >>>>> in my bundle directory "\webroot". I want "\webroot" to correspond to the >>>>> root ("\") context path. >>>>> >>>>> I also have a couple of Servlets providing services for my javascript >>>>> files: >>>>> >>>>> - One using the context path "\api" that provides general services. >>>>> - One using the context path "\admin\login" for logging in. Shiro is >>>>> automatically implementing "\admin\logout" since I specify in my shiro.ini >>>>> that this should be the logout page. >>>>> >>>>> In addition to the above, I need to externalize some of my resources >>>>> to a normal directory in the file system. My web application uses >>>>> different >>>>> logos for the different clients and they can upload their logos on their >>>>> own so they cannot be a static part of the web application. >>>>> >>>>> So I need something like this: >>>>> >>>>> a) The bundle's "\webroot" mapped to "\" >>>>> b) Servlet mapped to "\api" >>>>> c) Serlvet mapped to "\admin\login" (and "\admin\logout" via Shiro) >>>>> d) Normal directory mapped to "\logo". >>>>> >>>>> I can get the individual pieces working but not together. If I put >>>>> everything under "\hp" instead of under "\" then it works fine but that >>>>> context part is not acceptable. I need to put it under "\" since there are >>>>> existing URL's on the public site that must remain as today. >>>>> >>>>> Might sound a bit complicated but I don't think it's an unusual setup. >>>>> >>>>> /Bengt >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> 2016-11-07 20:09 GMT+01:00 'Achim Nierbeck' via OPS4J < >>>>> [email protected]>: >>>>> >>>>>> Hi Bengt, >>>>>> >>>>>> regarding issue #1 ... could you try to do something as "documented" >>>>>> in this[1] integration test? >>>>>> If you abandon the first parameter, with only the alias, it's always >>>>>> bound to the root "/". >>>>>> >>>>>> regarding issue#2 ... I'm not sure yet, but might be solved with #1 >>>>>> done right ;) >>>>>> >>>>>> regards, Achim >>>>>> >>>>>> [1] - https://github.com/ops4j/org.ops4j.pax.web/blob/master/pax >>>>>> -web-itest/pax-web-itest-container/pax-web-itest-container-j >>>>>> etty/src/test/java/org/ops4j/pax/web/itest/jetty/RootAliasIn >>>>>> tegrationTest.java >>>>>> >>>>>> >>>>>> 2016-11-07 17:40 GMT+01:00 Bengt Rodehav <[email protected]>: >>>>>> >>>>>>> I'm using Pax-Web in Karaf 4.0.7. >>>>>>> >>>>>>> I have two problems with aliases: >>>>>>> >>>>>>> *Problem #1* >>>>>>> >>>>>>> If I register resources for the context path "/" (i e the root) as >>>>>>> follows: >>>>>>> >>>>>>> mWebService.registerResources("/", "/webroot", mHttpContext); >>>>>>> >>>>>>> Then my application is reachable at: >>>>>>> >>>>>>> http://localhost:8183//admin/login >>>>>>> >>>>>>> but not at: >>>>>>> >>>>>>> http://localhost:8183/admin/login >>>>>>> >>>>>>> I want to get rid of the double slash. However if I try this instead: >>>>>>> >>>>>>> mWebService.registerResources("", "/webroot", mHttpContext); >>>>>>> >>>>>>> Then I get: >>>>>>> >>>>>>> Caused by: java.lang.IllegalArgumentException: Alias does not start >>>>>>> with slash (/) >>>>>>> at org.ops4j.pax.web.service.spi. >>>>>>> model.ServletModel.validateAlias(ServletModel.java:169) >>>>>>> at org.ops4j.pax.web.service.spi. >>>>>>> model.ServletModel.<init>(ServletModel.java:53) >>>>>>> at org.ops4j.pax.web.service.spi. >>>>>>> model.ResourceModel.<init>(ResourceModel.java:29) >>>>>>> at org.ops4j.pax.web.service.inte >>>>>>> rnal.HttpServiceStarted.registerResources(HttpServiceStarted >>>>>>> .java:262) >>>>>>> at org.ops4j.pax.web.service.inte >>>>>>> rnal.HttpServiceProxy.registerResources(HttpServiceProxy.java:71) >>>>>>> at org.ops4j.pax.web.service.WebC >>>>>>> ontainer$$Proxy.registerResources(Unknown Source) >>>>>>> at se.digia.hp.web.HpWebService._ >>>>>>> _M_init(HpWebService.java:133) >>>>>>> at se.digia.hp.web.HpWebService.init(HpWebService.java) >>>>>>> at se.digia.hp.web.HpWebService._ >>>>>>> _M_starting(HpWebService.java:47) >>>>>>> at se.digia.hp.web.HpWebService.starting(HpWebService.java) >>>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native >>>>>>> Method)[:1.8.0_74] >>>>>>> at sun.reflect.NativeMethodAccess >>>>>>> orImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_74] >>>>>>> at sun.reflect.DelegatingMethodAc >>>>>>> cessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_74] >>>>>>> at java.lang.reflect.Method.invok >>>>>>> e(Method.java:498)[:1.8.0_74] >>>>>>> at org.apache.felix.ipojo.util.Ca >>>>>>> llback.call(Callback.java:237)[50:org.apache.felix.ipojo:1.12.1] >>>>>>> at org.apache.felix.ipojo.util.Ca >>>>>>> llback.call(Callback.java:193)[50:org.apache.felix.ipojo:1.12.1] >>>>>>> at org.apache.felix.ipojo.handler >>>>>>> s.lifecycle.callback.LifecycleCallback.call(LifecycleCallbac >>>>>>> k.java:86)[50:org.apache.felix.ipojo:1.12.1] >>>>>>> at org.apache.felix.ipojo.handler >>>>>>> s.lifecycle.callback.LifecycleCallbackHandler.__M_stateChang >>>>>>> ed(LifecycleCallbackHandler.java:162)[50:org.apache.felix.i >>>>>>> pojo:1.12.1] >>>>>>> >>>>>>> How can I get rid of the "double slash"? >>>>>>> >>>>>>> *Problem #2* >>>>>>> >>>>>>> Assume that my web application resides at the context url: >>>>>>> >>>>>>> http://localhost:8183/hp >>>>>>> >>>>>>> I also register a separate resource directory directly in jetty with >>>>>>> the following configuration (as I was helped by Achim on this forum): >>>>>>> >>>>>>> <?xml version="1.0"?> >>>>>>> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" " >>>>>>> http://www.eclipse.org/jetty/configure_9_0.dtd"> >>>>>>> >>>>>>> <Configure id="Server" class="org.eclipse.jetty.server.Server"> >>>>>>> <Get name="handler"> >>>>>>> <Call name="addHandler"> >>>>>>> <Arg> >>>>>>> <New class="org.eclipse.jetty.serve >>>>>>> r.handler.ContextHandler"> >>>>>>> <Set name="contextPath">/logo</Set> >>>>>>> <Set name="handler"> >>>>>>> <New class="org.eclipse.jetty.serve >>>>>>> r.handler.ResourceHandler"> >>>>>>> <Set name="resourceBase">../../common/etc/logo</Set> >>>>>>> <Set name="directoriesListed">true</Set> >>>>>>> </New> >>>>>>> </Set> >>>>>>> </New> >>>>>>> </Arg> >>>>>>> </Call> >>>>>>> </Get> >>>>>>> </Configure> >>>>>>> >>>>>>> This works fine. But when I try to move the application up to the >>>>>>> root (which has the double slash problem as described in Problem #1) to >>>>>>> the >>>>>>> following url: >>>>>>> >>>>>>> http://localhost:8183// >>>>>>> >>>>>>> Then the separate resource via my jetty.xml does not work. It seems >>>>>>> that it cannot be a descendant of the context path I use for my web >>>>>>> application. But, since this is a public web application, with a >>>>>>> predetermined url, it must reside at the root. Then there is no context >>>>>>> path that works for my separate resource directory since all paths are >>>>>>> descendants of root. >>>>>>> >>>>>>> This seems a bit weird... >>>>>>> >>>>>>> /Bengt >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> -- >>>>>>> ------------------ >>>>>>> OPS4J - http://www.ops4j.org - [email protected] >>>>>>> >>>>>>> --- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "OPS4J" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to [email protected]. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> >>>>>> Apache Member >>>>>> Apache Karaf <http://karaf.apache.org/> Committer & PMC >>>>>> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> >>>>>> Committer & Project Lead >>>>>> blog <http://notizblog.nierbeck.de/> >>>>>> Co-Author of Apache Karaf Cookbook <http://bit.ly/1ps9rkS> >>>>>> >>>>>> Software Architect / Project Manager / Scrum Master >>>>>> >>>>>> -- >>>>>> -- >>>>>> ------------------ >>>>>> OPS4J - http://www.ops4j.org - [email protected] >>>>>> >>>>>> --- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "OPS4J" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >>>>> -- >>>>> ------------------ >>>>> OPS4J - http://www.ops4j.org - [email protected] >>>>> >>>>> --- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "OPS4J" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> >>>> >>>> -- >>>> >>>> Apache Member >>>> Apache Karaf <http://karaf.apache.org/> Committer & PMC >>>> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> >>>> Committer & Project Lead >>>> blog <http://notizblog.nierbeck.de/> >>>> Co-Author of Apache Karaf Cookbook <http://bit.ly/1ps9rkS> >>>> >>>> Software Architect / Project Manager / Scrum Master >>>> >>>> -- >>>> -- >>>> ------------------ >>>> OPS4J - http://www.ops4j.org - [email protected] >>>> >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "OPS4J" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> -- >> -- >> ------------------ >> OPS4J - http://www.ops4j.org - [email protected] >> >> --- >> You received this message because you are subscribed to the Google Groups >> "OPS4J" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > > Apache Member > Apache Karaf <http://karaf.apache.org/> Committer & PMC > OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> Committer & > Project Lead > blog <http://notizblog.nierbeck.de/> > Co-Author of Apache Karaf Cookbook <http://bit.ly/1ps9rkS> > > Software Architect / Project Manager / Scrum Master > > -- > -- > ------------------ > OPS4J - http://www.ops4j.org - [email protected] > > --- > You received this message because you are subscribed to the Google Groups > "OPS4J" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- ------------------ OPS4J - http://www.ops4j.org - [email protected] --- You received this message because you are subscribed to the Google Groups "OPS4J" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
