2017-03-02 90 views
0

我目前正在嘗試創建一個Controller以全局處理所有未知的URL。所以我所做的就是創建下面排除Spring MVC控制器的請求映射中的某些路徑

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
@RequestMapping("/**") 
public class UnknownUrlController { 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String getError404() { 
     return "/error404"; 
    } 
} 

我的目的類似於一個控制器是確保剛剛返回一個字符串默認的servlet「未找到」瀏覽器沒有被引用。由於所有未知的URL都由本控制器處理,因此此策略起作用。

然而,問題是,該控制器還引起了我曾在我的WebMvcConfigurerAdapter配置的所有我的靜態資源(圖片,js和css文件)如下

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/css/**").addResourceLocations("/css/"); 
    registry.addResourceHandler("/js/**").addResourceLocations("/js/"); 
    registry.addResourceHandler("/img/**").addResourceLocations("/img/"); 
} 

所以不是我的靜態文件服務於瀏覽器,我的錯誤頁面取代了它的位置。雖然後來我明白控制器映射優先於此answer的靜態資源。這就是我想知道如何排除我的資源url映射被這個控制器處理的原因,所以它只會關注陷入未知的URL。

之前這一戰略出發我已經嘗試了一些其他的事情,我不能去上班(我可能失去了一些東西)

  1. 設置throwExceptionIfNoHandlerFound我的DispatcherServlet字段設置爲true,使當找不到URL映射的處理程序時應拋出的異常,然後按照here所述的全局處理。然而,似乎默認處理程序總是分配給未知路徑(/ **),因此不會引發異常。
  2. 創建了一個application.properties文件並設置了spring.mvc.throw-exception-if-no-handler-found = true。

我所有的配置都是基於Java的,沒有任何xml文件,並希望保持這種方式。

回答

1

有一個更好的方法來在Spring中編寫自定義錯誤處理程序。看到這個如下:

@ExceptionHandler(ResourceNotFoundException.class) 
@ResponseStatus(HttpStatus.NOT_FOUND) 
public String handleResourceNotFoundException() { 
    return "notfound"; 
} 

It as a nice blog entry about exception handlers in Spring MVC.

如果DispatcherServlet會不會在404的情況下拋出一個異常,那麼你應該打開它使用setThrowExceptionIfNoHandlerFound DispatcherServlet的()方法。

Here you can find more information about, how to turn it on

+0

Hi Sawo。我也閱讀了該鏈接。如果你看看我說的第一件事,我試過了,這裏的鏈接實際上鍊接到同一篇文章。我實現該技術的問題是,當URL不映射到任何控制器時,Dispatcher Servlet不會引發任何異常。所以沒有可以處理的異常。 – dawuzi

+0

在dispatcherServlet中,你可以設置它應該在404情況下拋出一個異常。下面是控制它的方法:http://docs.spring.io/spring-framework/docs/current/javadoc-api /org/springframework/web/servlet/DispatcherServlet.html#setThrowExceptionIfNoHandlerFound-boolean- – SaWo

+0

Hi Sawo。我也嘗試過,但不是拋出一個異常,而是一直分配給默認的Servlet,它只是向瀏覽器返回「Not Found」 – dawuzi

0

終於找到了如何解決這個問題。解決方案是刪除我的Java配置中的默認servlet處理程序。在我的Java配置類(擴展WebMvcConfigurerAdapter一)我早些時候曾啓用了默認的Servlet如下

@Override 
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
} 

這與配置的URL映射/ A DefaultServletHttpRequestHandler **在本section的Spring MVC的文檔的解釋。這就是爲什麼沒有發現任何異常時,即使我已經將我的DispatcherServletthrowExceptionIfNoHandlerFound設置爲true,正如我在我的問題中所述。

從我的課上刪除配置後。我創建了一個全局異常處理程序類,併爲NoHandlerFoundException個案添加了一個方法。這是在找不到URL映射的Controller處理程序時引發的異常。示例代碼如下所示。這在spring mvc文檔的這個section中也有很好的解釋。

@ControllerAdvice 
public class GlobalExceptionHandler { 

    @ExceptionHandler(NoHandlerFoundException.class) 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @RequestMapping(value = {"/*","/**"},method = RequestMethod.GET) 
    public String handle(HttpServletRequest request, NoHandlerFoundException ex) { 
     return "error-404"; 
    } 
}