2016-07-11 9 views
0

カスタムサーブレットを登録しようとしています。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つの豆の復帰リストのみ(私のサーブレット)beanTypeはjavaxのサーブレットであると私はの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に「/」にハードコードマッピング。

これは、 '/'(DispatcherServletと私のPingServlet)への2つのマッピングがあるため、それらがjettyを埋め込むのを失敗させます。

何が問題なのですか?

+0

' PingServlet'は例えばDispatcherServletによって処理されます)。 –

+0

おかげで、私はbean名がそれ自身で動くべきだと思った。したがって、私のサーブレットが唯一のものであれば動作しますか? – YaOg

+0

'ServletRegistrationBean'でマッピングを指定したり、サーブレットの登録を無効にしたりしない限り、後者の場合、リクエストは' DispatcherServlet'によって処理され、次にDispatcherServletがBeanの名前に基づいてサーブレットにディスパッチします。呼び出されるURL。 –

答えて

0

@Mに感謝します。この作品Deinum:あなたはマッピングを指定するために `ServletRegistrationBean`を使用してURLにマッピングしたいとも、それはデフォルトの処理から除外していることがあれば、あなたがしたい場合(、期待する正確に何である

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