2016-07-11 4 views
0

Я пытаюсь зарегистрировать собственный сервлет.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).

Какие-нибудь идеи, что здесь не так?

+0

То есть именно то, что ожидать, если вы хотите, чтобы отобразить его в URL использовать 'ServletRegistrationBean' указать отображение, а также, чтобы он исключен из обработки по умолчанию (если вы хотите' PingServlet' обрабатывается, например, 'DispatcherServlet'). –

+0

Спасибо, я думал, что имя bean должно работать на себя. Значит, он работает только в том случае, если мой сервлет - единственный? – YaOg

+0

Исправьте, если вы не указали сопоставление через «ServletRegistrationBean» или отключили сервлет для регистрации, в последнем случае запрос будет обрабатываться «DispatcherServlet», который, в свою очередь, отправит его в ваш сервлет на основе имени компонента и URL, который будет вызываться. –

ответ

0

Благодаря @M. Deinum Это работает:

@Bean 
public ServletRegistrationBean pingRegistration(PingServlet pingServlet) { 
    ServletRegistrationBean registration = new ServletRegistrationBean(
      pingServlet); 
    registration.addUrlMappings("/probe/*"); 
    return registration; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^