Spring Boot Rest - 如何配置404 - 资源未找到

6 浏览
0 Comments

Spring Boot Rest - 如何配置404 - 资源未找到

我有一个工作的Spring Boot Rest服务。当路径错误时,它不返回任何内容。完全没有响应。同时也不会抛出错误。理想情况下,我期望返回一个404未找到错误。

我有一个GlobalErrorHandler

@ControllerAdvice

public class GlobalErrorHandler extends ResponseEntityExceptionHandler {

}

ResponseEntityExceptionHandler中有这个方法

protected ResponseEntity handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers,

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 appClass = Application.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;

}

}

0
0 Comments

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。谢谢。

0
0 Comments

问题出现的原因是没有正确配置DispatcherServlet,导致404资源未找到的错误。解决方法是在代码中配置DispatcherServlet,可以使用一个单独的ExceptionHandlingConfig类,并在该类中配置DispatcherServlet的属性ThrowExceptionIfNoHandlerFound为true。需要注意的是,这个方法需要在类上添加@Configuration注解才能生效。

0
0 Comments

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 handleNoHandlerFound404() {
  return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}

通过以上配置和方法,我们可以解决Spring Boot Rest服务中404错误的问题。

0