2009-11-10 5 views
1

Мое приложение требует нескольких реализаций интерфейса, которые требуют, чтобы сервер Jetty выполнял свою работу. Это, однако, не обязательно имеет место в каждой реализации этих интерфейсов, поэтому сервер Jetty является только зависимостью.Инъекция зависимостей: Jetty 7

Поскольку было бы огромной болью, чтобы обернуть весь сервер причала со всеми его конфигурациями протоколирования, коннектора и обработчика, я хочу, чтобы сервер был добавлен к этим реализациям с помощью Spring. Я решил, что инъекция класса Server не является хорошей идеей, поскольку реализация может остановить сервер, даже если он необходим в другом месте. В настоящее время я добавляю пустые классы HandlerList к этим реализациям, и они регистрируют свои обработчики, чтобы избежать этих проблем.

Проблема: эти обработчики могут вмешиваться в работу других обработчиков, например: реализация может регистрировать обработчик для/foo, а реализация - тоже ... проблема. Кто-нибудь использовал Jetty в такой среде? И как решить эту проблему?

Мой XML прояснить мою проблему:

<bean id="jetty" class="org.eclipse.jetty.server.Server" destroy-method="stop"> 
    <property name="connectors"> 
     <list> 
      <bean class="org.eclipse.jetty.server.bio.SocketConnector"> 
       <property name="host" value="10.8.0.46" /> 
       <property name="port" value="9999" /> 
      </bean> 
     </list> 
    </property> 

    <property name="handler"> 
     <bean class="org.eclipse.jetty.server.handler.HandlerCollection"> 
      <property name="handlers"> 
       <list> 
        <ref bean="jetty.handlerList" /> 
        <bean class="org.eclipse.jetty.server.handler.RequestLogHandler"> 
         <property name="requestLog"> 
          <bean class="org.eclipse.jetty.server.NCSARequestLog"> 
           <constructor-arg value="${jetty.logfile}" /> 
           <property name="extended" value="false"/> 
          </bean> 
         </property> 
        </bean> 
       </list> 
      </property> 
     </bean> 
    </property> 

    <property name="sendServerVersion" value="false" /> 
</bean> 

<bean id="jetty.handlerList" class="org.eclipse.jetty.server.handler.HandlerList" /> 

Если я требую пустой HandlerList я использую что-то вроде этого, где com.example.myapp.util.ioc.CreateHandlerListFactory является org.springframework.beans.factory.FactoryBean, который создает новый HandlerList в пределах данного HandlerList.

<constructor-arg> 
    <bean class="com.example.myapp.util.ioc.CreateHandlerListFactory"> 
     <constructor-arg ref="jetty.handlerList"/> 
    </bean> 
</constructor-arg> 

ответ

0

У меня есть несколько возможных предложений:

Добавить org.eclipse.jetty.servlet.ServletHandler и вместо Jetty-Обработчики, карта стандартных сервлетов вместо этого. Вы можете установить Servlets ServletHandler, добавив их по очереди (каждый из которых завернут в ServletHolder) или с помощью setServlets (ServletHolder []). Аналогично устанавливаются значения ServletMappings.

Вы можете внедрить ServletHandler в каждую реализацию интерфейса, чтобы добавить их подключенные сервлеты или централизовать создание массивов ServletHolders и ServletMappings, тем самым предотвращая дублирование путей, сохраняя контроль над этими путями из каждой реализации интерфейса. Последнее также позволило бы, по крайней мере, реализовать реализации интерфейса против стандартного API сервлета, делая основную часть вашего кода независимым от Jetty.