Инъекция зависимости: Jetty 7 - PullRequest
1 голос
/ 10 ноября 2009

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

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

Проблема: Эти обработчики могут мешать другим обработчикам, например: реализация 1 может зарегистрировать обработчик для / foo и реализация 2 тоже ... проблема. Кто-нибудь использовал 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>

1 Ответ

0 голосов
/ 26 ноября 2009

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

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

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

...