I use here just Pax Web DefaultListenerMapping and DefaultServletMapping
without any mods.
ListenerMapping and ServletMapping services are tracked by
org.ops4j.pax.web.pax-web-extender-whiteboard bundle.
And then pax-web-extender bundle publishes listener and servlet in some
default http context.

Here is the pax web user guide:
https://ops4j1.jira.com/wiki/display/paxweb/Whiteboard+Extender

May be, pax-web-extender doesn't publish web elements (listener and servlet)
in strict order, because it knows nothing about dependency between them.
So this is the question to pax web extender developers, if there is some way
to config publishing order in pax web extender.

I've tried even with the simplest servlet and listener, the situation is the
same: listener and servlet are registered randomly inspite of "depends-on"
option in blueprint config.

Sample Code:
*Listener*
package org.foo.bar.servlet;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestListener implements ServletContextListener {
        private static final Logger logger =
LoggerFactory.getLogger(TestListener.class);

        @Override
        public void contextInitialized(ServletContextEvent sce) {
                logger.info("Servlet init caught!");
        }

        @Override
        public void contextDestroyed(ServletContextEvent sce) {
                logger.info("Servlet destruction caught!");
        }

}

*Servlet*
package org.foo.bar.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestServlet extends HttpServlet {

        private static final long serialVersionUID = 1L;

        private static final Logger logger =
LoggerFactory.getLogger(TestServlet.class);

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse
response)
                        throws ServletException, IOException {
                response.setCharacterEncoding("UTF-8");
                response.setHeader("Content-Type", "text/html; charset=UTF-8");
                final PrintWriter writer = response.getWriter();
                writer.println("<html><body align='center'>");
                writer.println("< h1 >TestServlet< /h1 >");
                writer.println("</body></html>");
        }

        @Override
        public void destroy() {
                super.destroy();
                logger.info("Servlet destroyed!");
        }

        @Override
        public void init() throws ServletException {
                super.init();
                logger.info("Servlet initialized!");
        }

}

*Blueprint*
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xsi:schemaLocation="
            http://www.osgi.org/xmlns/blueprint/v1.0.0
https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd";>

        <bean id="listener" class="org.foo.bar.servlet.TestListener" />

        <service id="listenerMapping"
                
interface="org.ops4j.pax.web.extender.whiteboard.ListenerMapping">
                <bean
                
class="org.ops4j.pax.web.extender.whiteboard.runtime.DefaultListenerMapping">
                        <property name="listener" ref="listener" />
                </bean>
        </service>

        <bean id="servlet" class="org.foo.bar.servlet.TestServlet" />

        <service 
interface="org.ops4j.pax.web.extender.whiteboard.ServletMapping"
                depends-on="listenerMapping">
                <bean
                
class="org.ops4j.pax.web.extender.whiteboard.runtime.DefaultServletMapping">
                        <property name="loadOnStartup" value="1" />
                        <property name="servlet" ref="servlet" />
                        <property name="alias" value="/example" />
                        <property name="urlPatterns">
                                <array>
                                        <value>/example/*</value>
                                </array>
                        </property>
                </bean>
        </service>
</blueprint>

Pavel


CLEMENT Jean-Philippe wrote
> From this Blueprint the ListenerMapping should be exposed before the
> ServletMapping.
> 
> Several thoughts:
> * I would suggest to test this with a simple bundle containing a couple of
> "reference-list" on ListenerMapping and ServletMapping to be sure
> * Maybe the bean handling the ListenerMapping is asynchronous
> (configuration?)
> * Your ListenerMapping has a setter to the shiroListener bean so may lead
> to a NPE (which can be caught somewhere and not traced!)
> 
> JP





-----
Pavel
--
View this message in context: 
http://karaf.922171.n3.nabble.com/PAX-WEB-ServletMapping-service-sometimes-starts-before-ServletContextListenerMapping-tp4045660p4045682.html
Sent from the Karaf - User mailing list archive at Nabble.com.

Reply via email to