Избегайте автоматического сопоставления сервлета для сервлета, созданного как @Bean в Spring Boot

У меня есть сервлет, которому мне нужно предоставить зависимости через автопроводку (это класс из внешней библиотеки, я не могу изменить его код). Я пытаюсь зарегистрировать его как 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?) автоматически отображает сервлет по умолчанию /. Я хотел бы вообще избежать сопоставления, поскольку мне просто нужно создать экземпляр сервлета; Я сам потом зарегистрирую.

Можно ли это сделать?

1
0
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

вы должны использовать 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. Да, я могу сделать это вручную с помощью AutowireCapableBeanFactory#autowireBean() программно, но это немного некрасиво. Вопрос заключался в том, можно ли создать сервлет как обычно @Bean И избежать его автоматического сопоставления с /?

Roman Puchkovskiy 31.05.2019 14:00

Вы можете внедрить свой MyServlet bean-компонент в определение его регистрации. Я обновил ответ, чтобы показать, как это сделать.

Andy Wilkinson 31.05.2019 15:21

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