2016-07-11 46 views
0

我正在嘗試註冊自定義servlet。Spring引導自定義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種豆只(我的servlet)雖然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的名字應該可以自己工作。所以它只適用於我的Servlet是唯一的嗎? – YaOg

+0

更正,除非您通過'ServletRegistrationBean'指定映射或者禁用您的servlet進行註冊,在後一種情況下,請求將由'DispatcherServlet'處理,而DispatcherServlet又根據bean的名稱將其分派到您的servlet,即將被調用的URL。 –

回答

0

感謝@M。 Deinum這工作:

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