У меня есть сервлет, которому мне нужно предоставить зависимости через автопроводку (это класс из внешней библиотеки, я не могу изменить его код). Я пытаюсь зарегистрировать его как bean-компонент, а затем зарегистрировать его с помощью программной регистрации (ServletContextInitializer). Вот что у меня есть:
@Configuration
public class MyConfiguration {
@Bean
public MyServlet myServlet() {
return new MyServlet();
}
}
Кроме того, автоконфигурация, связанная со SpringMVC, создает обычный DispatcherServlet и сопоставляет его с /.
Когда я пытаюсь запустить приложение, я получаю следующее:
Caused by: java.lang.IllegalStateException: Multiple servlets map to path /: dispatcherServlet[mapped:JAVAX_API:null],myServlet[mapped:JAVAX_API:null]
Итак, похоже, что Spring Boot (или сама Spring?) автоматически отображает сервлет по умолчанию /. Я хотел бы вообще избежать сопоставления, поскольку мне просто нужно создать экземпляр сервлета; Я сам потом зарегистрирую.
Можно ли это сделать?
вы должны использовать ServletRegistrationBean тогда вы можете предоставить дополнительное сопоставление
@Bean
public MyServlet myServlet() {
return new MyServlet();
}
@Bean
public ServletRegistrationBean myServletRegistration(MyServlet myServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(myServlet,
"/myservlet/*");
registration.setLoadOnStartup(1);
return registration;
}
Вы можете внедрить свой MyServlet bean-компонент в определение его регистрации. Я обновил ответ, чтобы показать, как это сделать.
Спасибо, но мне нужно автоматически связать экземпляр
MyServlet. Да, я могу сделать это вручную с помощьюAutowireCapableBeanFactory#autowireBean()программно, но это немного некрасиво. Вопрос заключался в том, можно ли создать сервлет как обычно@BeanИ избежать его автоматического сопоставления с/?