MessageBrokerServlet с подходом XmlWebAppInitializer - PullRequest
0 голосов
/ 22 января 2019

Я хочу удалить свой файл web.xml из моего загрузочного проекта Spring.

Я пытаюсь использовать гибридный подход (как это руководство ).

IЭто MessageBrokerServlet определите в моем web.xml следующим образом:

<servlet>
    <servlet-name>MessageBrokerServlet</servlet-name>
    <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>MessageBrokerServlet</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

Этот сервлет использует файл services-config.xml о своей конфигурации.

В руководстве, когда я 'я сопоставил сервлет с файлом конфигурации, который я должен написать следующим образом:

ServletRegistration.Dynamic dispatcher = container
      .addServlet("dispatcher", new DispatcherServlet(context));

Поэтому я связываю сервлет с его контекстным файлом, но мой MessageBrokerServlet не имеет конструкции с параметром, поэтому я написал этоследующий код:

    // MessageBrokerServlet
    XmlWebApplicationContext context = new XmlWebApplicationContext();
    context.setConfigLocation("/WEB-INF/flex/services-config.xml");

    MessageBrokerServlet mbs = new MessageBrokerServlet();

    mbs.init(context.getServletConfig());
    ServletRegistration.Dynamic messageBrokenServlet = container.addServlet("MessageBrokerServlet", mbs);

    messageBrokenServlet.setLoadOnStartup(1);
    messageBrokenServlet.addMapping("/messagebroker/*");

    container.addListener(new ContextLoaderListener(context));

Но когда я получаю servletConfig из объекта контекста, он становится пустым.

Как я могу передать своему MessageBrokerServlet правильное servletConfig, поэтому яможно связать с services-config.xml file?

1 Ответ

0 голосов
/ 22 января 2019

Жизненный цикл MessageBrokerServlet обрабатывается контейнером сервлета.В этом нет никакой разницы (ну, может быть, немного) в приложении Spring Boot.Поэтому нет необходимости вызывать метод init.

MessageBrokerServlet также не имеет ничего общего с Spring, поэтому попытка загрузить конфигурацию с помощью Spring и затем ожидать, что MessageBrokerServlet будет действовать, ничего не изменит.

С помощью Spring Boot вы можете просто зарегистрировать сервлет в качестве компонента в контексте приложения, и Spring Boot позаботится о регистрации.Для регистрации сервлета оберните его в ServletRegistrationBean для передачи параметров инициализации и дальнейшей настройки.См. Также этот раздел Справочного руководства по загрузке Spring.

@Bean
public MessageBrokerServlet messageBrokerServlet() {
    return new MessageBrokerServlet();
}

@Bean
public ServletRegistrationBean<MessageBrokerServlet> messageBrokerServletRegistration() {
    ServletRegistrationBean<MessageBrokerServlet> registration = 
        new ServletRegistrationBean(messageBrokerServlet(), "/messagebroker/*");        
    return registration;
}

Поместите его в свой @SpringBootApplication аннотированный класс или в конкретный @Configuration аннотированный класс.

Это имитирует именно то, что вы опубликовали как часть вашего web.xml.Если у вас есть дополнительные блоки init-param (вы их не показывали), вы можете использовать метод addInitParameter, чтобы добавить их в ServletRegistrationBean.

...