Spring Boot Rest - 如何配置404 - 资源未找到
Spring Boot Rest - 如何配置404 - 资源未找到
我有一个工作的Spring Boot Rest服务。当路径错误时,它不返回任何内容。完全没有响应。同时也不会抛出错误。理想情况下,我期望返回一个404未找到错误。
我有一个GlobalErrorHandler
@ControllerAdvice
public class GlobalErrorHandler extends ResponseEntityExceptionHandler {
}
ResponseEntityExceptionHandler中有这个方法
protected ResponseEntity
HttpStatus status, WebRequest request) {
return handleExceptionInternal(ex, null, headers, status, request);
}
我在属性中标记了error.whitelabel.enabled=false
为了让该服务向客户端抛出404未找到的响应,我还需要做什么?
我参考了很多线程,没有看到其他人遇到这个问题。
这是我的主要应用程序类
@EnableAutoConfiguration // Spring Boot自动配置
@ComponentScan(basePackages = "com.xxxx")
@EnableJpaRepositories("com.xxxxxxxx") // 分离MongoDB和JPA存储库。
// 否则不需要。
@EnableSwagger // 自动生成API文档
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableConfigurationProperties
public class Application extends SpringBootServletInitializer {
private static Class
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(appClass).properties(getProperties());
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public FilterRegistrationBean correlationHeaderFilter() {
FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
filterRegBean.setFilter(new CorrelationHeaderFilter());
filterRegBean.setUrlPatterns(Arrays.asList("/*"));
return filterRegBean;
}
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
static Properties getProperties() {
Properties props = new Properties();
props.put("spring.config.location", "classpath:/");
return props;
}
@Bean
public WebMvcConfigurerAdapter webMvcConfigurerAdapter() {
WebMvcConfigurerAdapter webMvcConfigurerAdapter = new WebMvcConfigurerAdapter() {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false).favorParameter(true).parameterName("media-type")
.ignoreAcceptHeader(false).useJaf(false).defaultContentType(MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML).mediaType("json", MediaType.APPLICATION_JSON);
}
};
return webMvcConfigurerAdapter;
}
@Bean
public RequestMappingHandlerMapping defaultAnnotationHandlerMapping() {
RequestMappingHandlerMapping bean = new RequestMappingHandlerMapping();
bean.setUseSuffixPatternMatch(false);
return bean;
}
}
Spring Boot Rest - 如何配置404 - 资源未找到
解决方法非常简单:
首先,您需要实现一个控制器来处理所有的错误情况。这个控制器必须有一个@ControllerAdvice
注解,用于定义适用于全部异常的方法。
@ControllerAdvice public class ExceptionHandlerController { @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(value= HttpStatus.NOT_FOUND) @ResponseBody public ErrorResponse requestHandlingNoHandlerFound() { return new ErrorResponse("custom_404", "message for 404 error code"); } }
在@ExceptionHandler
注解中提供您想要覆盖响应的异常。NoHandlerFoundException
是一个在Spring无法处理请求时生成的异常(404情况)。您还可以指定Throwable
来覆盖任何异常。
其次,您需要告诉Spring在404情况下抛出异常(无法解析处理程序):
@SpringBootApplication public class Application { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); DispatcherServlet dispatcherServlet = (DispatcherServlet)ctx.getBean("dispatcherServlet"); dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); } }
当我使用未定义的URL时的结果是:
{ "errorCode": "custom_404", "errorMessage": "message for 404 error code" }
更新:如果您使用application.properties
配置您的Spring Boot应用程序,则需要添加以下属性,而不是在main方法中配置DispatcherServlet
(感谢@Saurabh):
spring.mvc.throw-exception-if-no-handler-found=true spring.web.resources.add-mappings=false
感谢您的帮助,但即使我做了这个更改,我仍然没有看到任何响应。请帮忙!
您能发布您的过滤器实现吗?CorrelationHeaderFilter将处理每个请求,可能是导致它不起作用的原因。我使用了与您的代码非常相似的代码进行了测试,如果我注释掉过滤器,添加@Component
注解,并注释掉不需要的注解(如@Service
和@Autowired
),它就能正常工作。如果您希望,我可以将简单的应用程序发布到GitHub上。
如果其他人遇到了代码示例的问题,当我使用属性配置调度程序servlet而不是在main方法中配置时,自定义ControllerAdvice对我的Spring Boot应用程序有效:spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
。当我将main中的dispatcherServlet配置移除并在application.properties中使用上述两个属性后,错误被正确路由到我的ControllerAdvice中。希望这对某人有所帮助!
请发布ErrorResponse类以使此答案完整。
当我将ErrorResponse类作为模型添加时,我无法获得自定义的404错误消息。错误日志:No converter found for return value of type: class co.x.model.ErrorResponse
,您能帮我吗?
请确保您的依赖项中有jackson-databind
,并且您的ErrorResponse和嵌套类有getter和setter方法。
Spring Boot的最新版本对此进行了进一步改进。
这真的很有帮助,但是在Spring Boot 2+中,将spring.resources.add-mappings=false
(已弃用)替换为spring.web.resources.add-mappings=false
。谢谢。
Spring Boot Rest - 如何配置404 - 资源未找到
当我们使用Spring Boot开发Rest服务时,有时会遇到404错误,即资源未找到。这可能是由于配置的问题导致的。下面我们将介绍出现这个问题的原因以及解决方法。
首先,在我们的Properties文件中添加以下配置:
spring:
mvc:
throw-exception-if-no-handler-found: true
web:
resources:
add-mappings: false
接下来,在我们的控制器类中添加以下方法:
@ExceptionHandler(NoHandlerFoundException.class) public ResponseEntity
通过以上配置和方法,我们可以解决Spring Boot Rest服务中404错误的问题。