MessageBrokerServlet с подходом XmlWebAppInitializer

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

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

Я определил этот 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?

ServletContext не является ApplicationContext. Вместо этого вы должны использовать переданный в ServletContext (который должен быть аргументом в вашем WebApplicationInitializer для получения конфигурации. Также, если вы используете Spring Boot, вы очень стараетесь обойти это.
M. Deinum 22.01.2019 13:08

Да, мой сценарий с загрузкой Spring

Joe Taras 22.01.2019 13:15

Почему вы даже пытаетесь втиснуть классы Spring в работу с MessageBrokerServlet, который не имеет ничего общего с Spring? Единственное, что вам нужно создать, это MessageBrokerServlet и обернуть его в ServletRegistationBean, чтобы передать параметр инициализации. Все остальное, что вам не нужно. Вы слишком много думаете и смешиваете DispatcherServlet (это совершенно другой зверь) с MessageBrokerServlet.

M. Deinum 22.01.2019 13:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

@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.

Большое Вам спасибо

Joe Taras 22.01.2019 14:26

Другие вопросы по теме