Standart Spring MVC uygulamanız, DispatcherServlet
Servlet konteynerinize kaydettiğiniz bir aracılığıyla tüm talepleri karşılayacaktır .
DispatcherServlet
Onun en bakar ApplicationContext
ve varsa, ApplicationContext
bir kayıtlı ContextLoaderListener
o kurulum kendi isteği sunma mantığı gereken özel fasulye için. Bu çekirdekler belgelerde açıklanmaktadır .
Muhtemelen en önemli, fasulye türü HandlerMapping
harita
işleyicilere gelen istekler ve ayrıntıları HandlerMapping
uygulamaya göre değişen bazı kriterlere göre ön ve son işlemcilerin (işleyici engelleyicileri) listesi . En popüler uygulama açıklamalı denetleyicileri destekler ancak başka uygulamalar da mevcuttur.
Bir JavadocHandlerMapping
ileri uygulamaları davranması gerektiğini açıklamaktadır.
DispatcherServlet
Bu türdeki tüm fasulye bulur ve bazı sırayla kaydeder (özelleştirilebilir). Bir istek sunarken, DispatcherServlet
bu HandlerMapping
nesneler arasında döngüler oluşturur getHandler
ve standart olarak temsil edilen gelen isteği işleyebilecek birini bulmak için her birini test eder HttpServletRequest
. 4.3.x'ten itibaren bulamazsa , gördüğünüz uyarıyı günlüğe kaydeder.
Hiçbir haritalama URI ile HTTP isteğinde bulundu [/some/path]
yılında DispatcherServlet
adı SomeName ile
ve ya bir atar NoHandlerFoundException
ya da yanıtı 404 Bulunamadı durum koduyla hemen tamamlar.
Neden vermedi DispatcherServlet
bir bulmak HandlerMapping
benim isteği ele verebilir?
En yaygın HandlerMapping
uygulama, fasulyelerin işleyiciler olarak RequestMappingHandlerMapping
kaydedilmesidir @Controller
(aslında @RequestMapping
açıklamalı yöntemler). Ya kendin (bu tip bir fasulye ilan edebilir @Bean
veya <bean>
veya başka bir mekanizma) ya da kullanabilirsiniz seçenekleri yerleşik . Bunlar:
- İle
@Configuration
sınıfınıza açıklama ekleyin @EnableWebMvc
.
<mvc:annotation-driven />
XML yapılandırmanızda bir üye bildirin .
Yukarıdaki bağlantıda açıklandığı gibi, her ikisi de bir RequestMappingHandlerMapping
fasulyeyi (ve bir sürü başka şeyi) kaydedecek . Ancak, HandlerMapping
bir işleyici olmadan a pek kullanışlı değildir. RequestMappingHandlerMapping
bazı @Controller
fasulye beklediğinden , bunları da @Bean
bir Java yapılandırmasındaki yöntemler veya <bean>
bir XML yapılandırmasındaki bildirimler yoluyla veya @Controller
her ikisinde de açıklamalı sınıfların bileşen taraması yoluyla bildirmeniz gerekir . Bu fasulyelerin mevcut olduğundan emin olun.
Uyarı mesajını ve bir 404 alıyorsanız ve yukarıdakilerin tümünü doğru şekilde yapılandırdıysanız , isteğinizi tespit edilen @RequestMapping
ek açıklamalı bir işleyici yöntemi tarafından işlenmeyen yanlış URI'ye gönderiyorsunuz demektir .
spring-webmvc
Kütüphane teklifler diğer yerleşik HandlerMapping
uygulamalar. Örneğin BeanNameUrlHandlerMapping
haritalar
URL'lerden eğik çizgiyle ("/") başlayan adlara kadar
ve her zaman kendi yazabilirsin. Açıkçası, gönderdiğiniz talebin kayıtlı HandlerMapping
nesnenin işleyicilerinden en az biriyle eşleştiğinden emin olmanız gerekir .
Örtük veya açık herhangi kayıt sen yoksa HandlerMapping
fasulye (veya eğer detectAllHandlerMappings
olduğunu true
), DispatcherServlet
kayıtlarını bazı varsayılan . Bunlar sınıfla DispatcherServlet.properties
aynı pakette tanımlanır DispatcherServlet
. Bunlar BeanNameUrlHandlerMapping
ve DefaultAnnotationHandlerMapping
(benzer RequestMappingHandlerMapping
ancak kullanımdan kaldırılmış).
Hata ayıklama
Spring MVC, üzerinden kaydedilen işleyicileri günlüğe kaydeder RequestMappingHandlerMapping
. Örneğin, bir @Controller
beğeni
@Controller
public class ExampleController {
@RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
public String example() {
return "example-view-name";
}
}
INFO düzeyinde aşağıdakileri günlüğe kaydedecek
Mapped "{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example()
Bu, kaydedilen eşleştirmeyi tanımlar. İşleyici bulunamadığına dair uyarıyı gördüğünüzde, mesajdaki URI'yi burada listelenen eşlemeyle karşılaştırın. @RequestMapping
İşleyiciyi seçmek için Spring MVC'de belirtilen tüm kısıtlamalar eşleşmelidir.
Diğer HandlerMapping
uygulamalar, eşlemelerine ve karşılık gelen işleyicilerine ipucu vermesi gereken kendi ifadelerini günlüğe kaydeder.
Benzer şekilde, Bahar'ın hangi fasulyeleri kaydettiğini görmek için DEBUG düzeyinde Bahar günlüğünü etkinleştirin. Hangi açıklamalı sınıfları bulduğunu, hangi paketleri taradığını ve hangi çekirdekleri başlattığını rapor etmelidir. Beklediğiniz mevcut değilse, ApplicationContext
yapılandırmanızı gözden geçirin .
Diğer yaygın hatalar
A DispatcherServlet
, tipik bir Java EE'dir Servlet
. Senin tipik ile Bunu kayıt <web.xml>
<servlet-class>
ve <servlet-mapping>
beyan veya doğrudan aracılığıyla ServletContext#addServlet
bir yer WebApplicationInitializer
, ya da her türlü mekanizma Bahar önyükleme kullanımları. Bu nedenle, Servlet belirtiminde belirtilen url eşleme mantığına güvenmeniz gerekir , Bölüm 12'ye bakın. Ayrıca bkz.
Bunu akılda tutarak, yaygın bir hata, DispatcherServlet
bir url eşlemesi ile kaydetmek, /*
bir @RequestMapping
eylemci yönteminden bir görünüm adı döndürmek ve bir JSP'nin işlenmesini beklemektir. Örneğin, bir işleyici yöntemi düşünün.
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
return "example-view-name";
}
bir ile InternalResourceViewResolver
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
isteğin yoldaki bir JSP kaynağına iletilmesini bekleyebilirsiniz /WEB-INF/jsps/example-view-name.jsp
. Bu olmayacak. Bunun yerine, bir bağlam adı varsayılarak Example
, DisaptcherServlet
will rapor
Hiçbir haritalama URI ile HTTP isteğinde bulundu [/Example/WEB-INF/jsps/example-view-name.jsp]
yılında DispatcherServlet
adı 'memuru' ile
Çünkü DispatcherServlet
eşleştirilmiş /*
ve /*
(daha yüksek önceliğe sahip tam eşleme, hariç) her şeyi maçları, DispatcherServlet
işlemek için seçileceğini forward
dan JstlView
(tarafından döndürülen InternalResourceViewResolver
). Hemen hemen her durumda, DispatcherServlet
böyle bir talebi karşılayacak şekilde yapılandırılmayacaktır .
Bunun yerine, bu basit durumda, kayıt olmalıdır DispatcherServlet
To /
varsayılan servlet olarak işaretlemeyi. Varsayılan sunucu uygulaması, bir istek için son eşleşmedir. Bu, tipik sunucu uygulaması kapsayıcınızın , varsayılan sunucu uygulamasını denemeden önce *.jsp
JSP kaynağını (örneğin Tomcat sahip JspServlet
) işlemek için eşlenen bir dahili Servlet uygulamasını seçmesine olanak tanır .
Örneğinizde gördüğünüz bu.