2017-03-02 99 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"; 
    } 
} 
相关问题