我正在嘗試註冊自定義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)。
任何想法這裏有什麼問題嗎?
那就是期待什麼,如果你想將它映射到一個URL使用'ServletRegistrationBean'指定的映射,也已經從默認的處理之外(如果你想' PingServlet'例如由DispatcherServlet處理)。 –
謝謝,我認爲這個bean的名字應該可以自己工作。所以它只適用於我的Servlet是唯一的嗎? – YaOg
更正,除非您通過'ServletRegistrationBean'指定映射或者禁用您的servlet進行註冊,在後一種情況下,請求將由'DispatcherServlet'處理,而DispatcherServlet又根據bean的名稱將其分派到您的servlet,即將被調用的URL。 –