一尘不染

如何使嵌入式Jetty使用在Servlet的父上下文中定义的AppContext

spring-mvc

我有一个独立的Java应用程序,该应用程序现在运行嵌入式Jetty服务器以公开用于HTTP的RESTful
API。从Hibernate到Jetty,它的确大量使用了Spring
bean。我为Jetty配置了DispatcherServlet(以为将来添加非REST API就像创建新Controller并为分派器正确映射一样简单)。

我的应用程序有一个带有main方法的类,该方法从我的appContext.xml创建一个ClassPathXmlApplicationContext来启动所有内容。

ApplicationContext ac= new ClassPathXmlApplicationContext(new String[] { "appContext.xml" });

我不知道如何使在DispatcherServlet的上下文配置文件中定义的bean可以访问在定义了码头的appContext.xml中定义的bean。我的码头定义如下:

<bean id="JettyServer" class="org.eclipse.jetty.server.Server" init-method="start" destroy-method="stop">

    <constructor-arg>
            <bean id="threadPool" class="org.eclipse.jetty.util.thread.QueuedThreadPool">
                <property name="minThreads" value="2"/>
                <property name="maxThreads" value="10"/>
            </bean>
    </constructor-arg>

    <property name="connectors">
        <list>
            <bean id="Connector" class="org.eclipse.jetty.server.ServerConnector">
                <constructor-arg ref="JettyServer"/>
                <property name="port" value="8090"/>
            </bean>
        </list>
    </property>

    <property name="handler">
        <bean id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
            <property name="handlers">
                <list>
                    <bean class="org.eclipse.jetty.servlet.ServletContextHandler">
                        <property name="contextPath" value="/"/>
                        <property name="servletHandler">
                            <bean class="org.eclipse.jetty.servlet.ServletHandler">
                                <property name="servlets">
                                    <list>
                                        <bean class="org.eclipse.jetty.servlet.ServletHolder">
                                            <property name="name" value="DefaultServlet"/>
                                            <property name="servlet">
                                                <bean class="org.springframework.web.servlet.DispatcherServlet"/>
                                            </property>
                                            <property name="initParameters">
                                                <map>
                                                    <entry key="contextConfigLocation" value="classpath:./DefaultServlet.xml" />
                                                </map>
                                            </property>
                                        </bean>
                                    </list>
                                </property>
                                <property name="servletMappings">
                                    <list>
                                        <bean class="org.eclipse.jetty.servlet.ServletMapping">
                                            <property name="pathSpecs">
                                                <list><value>/</value></list>
                                            </property>
                                            <property name="servletName" value="DefaultServlet"/>
                                        </bean>
                                    </list>
                                </property>
                            </bean>
                        </property>
                    </bean>
                    <bean class="org.eclipse.jetty.server.handler.RequestLogHandler">
                        <property name="requestLog">
                            <bean class="org.eclipse.jetty.server.NCSARequestLog">
                                <constructor-arg value="/opt/impulse/logs/jetty-yyyy_mm_dd.log"/>
                                <property name="extended" value="false" />
                            </bean>
                        </property>
                    </bean>
                </list>
            </property>
        </bean>
    </property>

  </bean>

然后,在DefaultServlet.xml中,我尝试定义一个带有属性的bean,该属性引用appContext.xml中定义的bean,这很麻烦。

<bean id="restApiController" class="com.mycompany.myapp.api.controllers.RESTfulController">
    <property name="someBean" ref="someBean"/>
</bean>

阅读 348

收藏
2020-06-01

共1个答案

一尘不染

您使用引导Jetty
applicationContext.xml,这反过来又用servlet配置来设置jetty。在其中,您正在使用contextConfigLocation指向servlet应用程序上下文的参数来配置servlet。即使您将其嵌入,它仍将作为Web应用程序运行。因此,您还需要向servlet提供其他Bean的配置。我建议您将码头设置提取到它自己的文件中,然后将其余的bean提取到另一个文件中。然后,您在中提供另一个上下文文件contextConfigLocation

编辑

如果您确实需要在jetty和servlet之间共享应用程序上下文,也许您可​​以使用此Blog中的一些信息。似乎有可能,但是看起来您必须手动关联上下文之间的父/子关系。

2020-06-01