为什么运行了java文件老是404_java – 为什么Spring MVC用404响应并报告“在...
您的標準Spring MVC應用程序將通過您在Servlet容器中注冊的DispatcherServlet提供所有請求.
DispatcherServlet查看其ApplicationContext,如果可用,則使用ContextLoaderListener注冊的ApplicationContext用于設置其請求服務邏輯的特殊bean. These beans are described in the documentation.
incoming requests to handlers and a list of pre- and post-processors
(handler interceptors) based on some criteria the details of which
vary by HandlerMapping implementation. The most popular implementation
supports annotated controllers but other implementations exists as
well.
DispatcherServlet查找此類型的所有bean并按某種順序注冊它們(可以自定義).在提供請求時,DispatcherServlet循環遍歷這些HandlerMapping對象并使用getHandler測試每個對象,以找到可以處理傳入請求的對象,表示為標準HttpServletRequest.從4.3.x開始,如果沒有找到任何,你看到的是logs the warning
No mapping found for HTTP request with URI [/some/path] in DispatcherServlet with name SomeName
和either拋出NoHandlerFoundException或立即提交404 Not Found狀態代碼的響應.
為什么DispatcherServlet找不到可以處理我的請求的HandlerMapping?
最常見的HandlerMapping實現是RequestMappingHandlerMapping,它處理將@Controller bean注冊為處理程序(實際上是他們的@RequestMapping注釋方法).您可以自己聲明這種類型的bean(使用@Bean或< bean>或其他機制),也可以使用the built-in options.這些是:
>使用@EnableWebMvc注釋您的@Configuration類.
>聲明一個< mvc:annotation-driven /> XML配置中的成員.
正如上面的鏈接所描述的,這兩個都將注冊一個RequestMappingHandlerMapping bean(以及一堆其他的東西).但是,沒有處理程序,HandlerMapping不是很有用. RequestMappingHandlerMapping需要一些@Controller bean,所以你需要通過Java配置中的@Bean方法或< bean>來聲明它們. XML配置中的聲明或通過@Controller注釋類的組件掃描.確保這些豆子存在.
如果您收到警告消息和404,并且您已正確配置了上述所有內容,則您將請求發送到錯誤的URI,該URI不會被檢測到的@RequestMapping帶注釋的處理程序方法處理.
spring-webmvc庫提供了其他內置的HandlerMapping實現.例如,BeanNameUrlHandlerMapping地圖
from URLs to beans with names that start with a slash (“/”)
而你總是可以自己寫.顯然,您必須確保您發送的請求至少匹配一個已注冊的HandlerMapping對象的處理程序.
如果您沒有隱式或顯式注冊任何HandlerMapping bean(或者如果detectAllHandlerMappings為真),則DispatcherServlet會注冊一些defaults.這些在DispatcherServlet.properties中定義在與DispatcherServlet類相同的包中.它們是BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping(類似于RequestMappingHandlerMapping但已棄用).
調試
Spring MVC將記錄通過RequestMappingHandlerMapping注冊的處理程序.例如,像@Controller一樣
@Controller
public class ExampleController {
@RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
public String example() {
return "example-view-name";
}
}
將在INFO級別記錄以下內容
Mapped "{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example()
這描述了已注冊的映射.當您看到沒有找到處理程序的警告時,請將消息中的URI與此處列出的映射進行比較. @RequestMapping中指定的所有限制必須與Spring MVC匹配才能選擇處理程序.
其他HandlerMapping實現記錄它們自己的語句,這些語句應該提示它們的映射和相應的處理程序.
類似地,在DEBUG級別啟用Spring日志記錄以查看Spring注冊的bean.它應該報告它找到哪些帶注釋的類,它掃描哪些包,以及它初始化的bean.如果您所期望的那些不存在,那么請查看您的ApplicationContext配置.
其他常見錯誤
DispatcherServlet只是一個典型的Java EE Servlet.您可以使用典型的< web.xml>注冊它. < servlet的類>和< servlet-mapping>聲明,或直接通過WebApplicationInitializer中的ServletContext#addServlet,或Spring引導使用的任何機制.因此,您必須依賴于Servlet specification中指定的url映射邏輯,請參閱第12章.另請參閱
考慮到這一點,一個常見的錯誤是使用/ *的url映射注冊DispatcherServlet,從@RequestMapping處理程序方法返回視圖名稱,并期望呈現JSP.例如,考慮一個像這樣的處理程序方法
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
return "example-view-name";
}
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
您可能希望請求是forwarded到路徑為/WEB-INF/jsps/example-view-name.jsp的JSP資源.這不會發生.相反,假設上下文名稱為Example,DisaptcherServlet將報告
No mapping found for HTTP request with URI [/Example/WEB-INF/jsps/example-view-name.jsp] in DispatcherServlet with name ‘dispatcher’
因為DispatcherServlet映射到/ *和/ *匹配所有內容(具有更高優先級的完全匹配除外),所以將選擇DispatcherServlet來處理JstlView中的轉發(由InternalResourceViewResolver返回).幾乎在所有情況下,DispatcherServlet都不會配置為處理這樣??的請求.
相反,在這種簡單的情況下,您應該將DispatcherServlet注冊到/,將其標記為默認servlet.默認servlet是請求的最后一個匹配項.這將允許您的典型servlet容器在嘗試使用默認servlet之前選擇映射到* .jsp的內部Servlet實現來處理JSP資源(例如,Tomcat具有JspServlet).
這就是你在你的例子中看到的.
總結
以上是生活随笔為你收集整理的为什么运行了java文件老是404_java – 为什么Spring MVC用404响应并报告“在...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql opensuse_opens
- 下一篇: JSR303数据校验-2021新版