开发者

ServletContext in Spring MVC application under Jetty

开发者 https://www.devze.com 2023-01-29 06:45 出处:网络
I try to create Spring MVC application that uses Jetty as servlet container. Feature of my approach is running Jetty inside Spring via bean:

I try to create Spring MVC application that uses Jetty as servlet container. Feature of my approach is running Jetty inside Spring via bean:

<bean id="server" class="org.mortbay.jetty.Server" destroy-method="stop">

    <property name="connectors">
        <list>
            <bean id="connector" class="org.mortbay.jetty.nio.SelectChannelConnector">
                <property name="port" value="9080" />
            </bean>
        </list>
    </property>

    <property name="handlers">
        <list>
            &开发者_运维技巧lt;ref bean="basicContext" />
        </list>
    </property>
</bean>

<bean name="basicContext" class="org.mortbay.jetty.servlet.Context">
    <property name="contextPath" value="/" />

    <property name="servletHandler">
        <bean class="org.mortbay.jetty.servlet.ServletHandler">
            <property name="servlets">
                <list>
                    <bean class="org.mortbay.jetty.servlet.ServletHolder">
                        <property name="name" value="spring-mvc" />
                        <property name="servlet">
                            <bean class="name.krestjaninoff.hello.util.DispatcherServletWrapper" />
                        </property>
                    </bean>
                </list>
            </property>

            <property name="servletMappings">
                <list>
                    <bean class="org.mortbay.jetty.servlet.ServletMapping">
                        <property name="servletName" value="spring-mvc" />
                        <property name="pathSpec" value="/*" />
                    </bean>
                </list>
            </property>
        </bean>
    </property>

</bean>

To pass application context to my servlet I use simple wrapper for DispatcherServlet that implements ContextAware interface:

public class DispatcherServletWrapper extends DispatcherServlet implements
        ApplicationContextAware {
    private static final long serialVersionUID = -5870408422415688046L;

    private ApplicationContext appContext;
    private ServletContext servletContext;

    public void setApplicationContext(ApplicationContext arg0)
            throws BeansException {
        this.appContext = arg0;
    }

    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    @Override
    protected WebApplicationContext createWebApplicationContext(
            WebApplicationContext arg0) throws BeansException {

        GenericWebApplicationContext wac = new GenericWebApplicationContext();
        wac.setParent(appContext);
        wac.refresh();

        return wac;
    }
}

Application starts well but when I try to get some page I get next exception:

2010-12-08 09:50:22,684 [29071401@qtp-4084687-0] DEBUG name.krestjaninoff.hello.util.DispatcherServletWrapper
 - org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:671)
 - Could not complete request
java.lang.NullPointerException
        at org.springframework.web.context.support.WebApplicationObjectSupport.getServletContext(WebApplicationObjectSupport.java:124)
        at org.springframework.web.servlet.view.JstlView.exposeHelpers(JstlView.java:135)
        at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:211)
        at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
        at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
        at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:326)
        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
        at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
        at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
        at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

So, problem occures in JstlView class when it tries get ServletContext. JstlView implements ServletContextAware interface, hence he must know about ServletContext.

In my opinion the problem lies in the fact that ServletContext instance is not created. Can anybody help me?

0

精彩评论

暂无评论...
验证码 换一张
取 消