我有一个独立的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>
您使用引导Jetty applicationContext.xml,这反过来又用servlet配置来设置jetty。在其中,您正在使用contextConfigLocation指向servlet应用程序上下文的参数来配置servlet。即使您将其嵌入,它仍将作为Web应用程序运行。因此,您还需要向servlet提供其他Bean的配置。我建议您将码头设置提取到它自己的文件中,然后将其余的bean提取到另一个文件中。然后,您在中提供另一个上下文文件contextConfigLocation。
applicationContext.xml
contextConfigLocation
编辑
如果您确实需要在jetty和servlet之间共享应用程序上下文,也许您可以使用此Blog中的一些信息。似乎有可能,但是看起来您必须手动关联上下文之间的父/子关系。