Я пытаюсь зарегистрировать собственный сервлет.Spring boot custom Servlet не сопоставляется с именем bean
Я использовал этот код в @Configuration
классе:
@Bean (name="probe")
public PingServlet probe(){
return new PingServlet();
}
Я думал, что это будет отображаться в/зонд, но это не так. Я сопоставляется «/», а причина в том, что в классе ServletContextInitializerBeans
, там этот метод:
private <T, B extends T> void addAsRegistrationBean(ListableBeanFactory beanFactory,
Class<T> type, Class<B> beanType, RegistrationBeanAdapter<T> adapter) {
List<Map.Entry<String, B>> beans = getOrderedBeansOfType(beanFactory, beanType,
this.seen);
for (Entry<String, B> bean : beans) {
if (this.seen.add(bean.getValue())) {
int order = getOrder(bean.getValue());
String beanName = bean.getKey();
// One that we haven't already seen
RegistrationBean registration = adapter.createRegistrationBean(beanName,
bean.getValue(), beans.size());
registration.setName(beanName);
registration.setOrder(order);
this.initializers.add(type, registration);
if (this.log.isDebugEnabled()) {
this.log.debug(
"Created " + type.getSimpleName() + " initializer for bean '"
+ beanName + "'; order=" + order + ", resource="
+ getResourceDescription(beanName, beanFactory));
}
}
}
}
Линия List<Map.Entry<String, B>> beans = getOrderedBeansOfType(beanFactory, beanType, this.seen);
, список возврата 1 боб только (мой сервлет), хотя beanType является javax Servlet, и я ожидал бы DispatcherServlet быть там также (я также использую Spring MVC).
Это приводит к ошибке в следующем методе (в классе ServletRegistrationBeanAdapter
):
@Override
public RegistrationBean createRegistrationBean(String name, Servlet source,
int totalNumberOfSourceBeans) {
String url = (totalNumberOfSourceBeans == 1 ? "/" : "/" + name + "/");
if (name.equals(DISPATCHER_SERVLET_NAME)) {
url = "/"; // always map the main dispatcherServlet to "/"
}
ServletRegistrationBean bean = new ServletRegistrationBean(source, url);
bean.setMultipartConfig(this.multipartConfig);
return bean;
}
Поскольку список фасоли имеет размер 1, в createRegistrationBean это трудно коды отображение на «/».
Это, в свою очередь, приводит к сбою встроенного причала, поскольку есть 2 сопоставления с '/' (DispatcherServlet и мой PingServlet).
Какие-нибудь идеи, что здесь не так?
То есть именно то, что ожидать, если вы хотите, чтобы отобразить его в URL использовать 'ServletRegistrationBean' указать отображение, а также, чтобы он исключен из обработки по умолчанию (если вы хотите' PingServlet' обрабатывается, например, 'DispatcherServlet'). –
Спасибо, я думал, что имя bean должно работать на себя. Значит, он работает только в том случае, если мой сервлет - единственный? – YaOg
Исправьте, если вы не указали сопоставление через «ServletRegistrationBean» или отключили сервлет для регистрации, в последнем случае запрос будет обрабатываться «DispatcherServlet», который, в свою очередь, отправит его в ваш сервлет на основе имени компонента и URL, который будет вызываться. –