Я хочу удалить файл 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?
Да, мой сценарий с загрузкой Spring
Почему вы даже пытаетесь втиснуть классы Spring в работу с MessageBrokerServlet, который не имеет ничего общего с Spring? Единственное, что вам нужно создать, это MessageBrokerServlet и обернуть его в ServletRegistationBean, чтобы передать параметр инициализации. Все остальное, что вам не нужно. Вы слишком много думаете и смешиваете DispatcherServlet (это совершенно другой зверь) с MessageBrokerServlet.




Жизненный цикл 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.
Большое Вам спасибо
ServletContextне являетсяApplicationContext. Вместо этого вы должны использовать переданный вServletContext(который должен быть аргументом в вашемWebApplicationInitializerдля получения конфигурации. Также, если вы используете Spring Boot, вы очень стараетесь обойти это.