2016-07-11 26 views
0

Ich versuche, ein benutzerdefiniertes Servlet zu registrieren.Spring Boot benutzerdefinierte Servlet nicht auf Bean-Name

habe ich diesen Code in einer @Configuration Klasse:

@Bean (name="probe") 
public PingServlet probe(){ 
    return new PingServlet(); 
} 

Ich dachte, dies zu/Sonde zugeordnet werden würde, aber es funktioniert nicht. I Karten zu ‚/‘ und der Grund dafür ist, dass in der Klasse ServletContextInitializerBeans, gibt diese Methode:

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)); 
      } 
     } 
    } 
} 

Die Linie List<Map.Entry<String, B>> beans = getOrderedBeansOfType(beanFactory, beanType, this.seen);, Rückkehr Liste von 1 Bohne nur (mein Servlet), obwohl beanType javax Servlet ist und ich würde erwarten, DispatcherServlet auch da zu sein (ich benutze auch Spring MVC).

Dies führt zu einem Fehler in dem folgende Verfahren (in Klasse 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; 
    } 

Da die Liste Bohnen der Größe 1, in der es schwer createRegistrationBean Codes die Abbildung auf '/'.

Dies verursacht wiederum, dass die eingebettete Jetty fehlschlägt, da 2 Zuordnungen zu '/' (DispatcherServlet und mein PingServlet) vorhanden sind.

Irgendwelche Ideen, was hier schief läuft?

+0

Das ist genau das, was erwarten, wenn Sie es an eine URL verwenden, um eine 'ServletRegistrationBean' zuordnen möchten die Zuordnung zu spezifizieren und sie auch von Standardverarbeitung ausgeschlossen zu haben (wenn Sie das wollen' PingServlet', das zum Beispiel von 'DispatcherServlet' verarbeitet werden soll. –

+0

Danke, ich dachte der Name der Bean sollte auf sich selbst arbeiten. Also funktioniert es nur, wenn mein Servlet der einzige ist? – YaOg

+0

Richtig, es sei denn, Sie geben eine Zuordnung über eine 'ServletRegistrationBean' an oder deaktivieren Ihr Servlet für die Registrierung. Im letzteren Fall wird die Anfrage von' DispatcherServlet' bearbeitet, die sie wiederum basierend auf dem Namen der Bean an Ihr Servlet sendet die URL, die aufgerufen werden soll. –

Antwort

0

Dank @M. Deinum Dies funktioniert:

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