当前位置: 首页 > 知识库问答 >
问题:

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

子车征
2023-03-14

我得到了一个工作Spring靴Rest服务。当路径错误时,它不会返回任何东西。一点反应都没有。同时它也不会抛出错误。理想情况下,我希望出现404 not found错误。

@ControllerAdvice
public class GlobalErrorHandler extends ResponseEntityExceptionHandler {

}

ResponseEntityExceptionHandler中有此方法

protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers,
                                                     HttpStatus status, WebRequest request) {

    return handleExceptionInternal(ex, null, headers, status, request);
}

我已在属性中标记error.whiteLabel.enabled=false

要将404 not found响应抛回客户端,我还必须为此服务执行什么操作

 @EnableAutoConfiguration // Sprint Boot Auto Configuration
@ComponentScan(basePackages = "com.xxxx")
@EnableJpaRepositories("com.xxxxxxxx") // To segregate MongoDB
                                                        // and JPA repositories.
                                                        // Otherwise not needed.
@EnableSwagger // auto generation of API docs
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableConfigurationProperties

public class Application extends SpringBootServletInitializer {

    private static Class<Application> 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;
    }
}

共有1个答案

沃博裕
2023-03-14

解决方法很简单:

首先,您需要实现将处理所有错误情况的控制器。此控制器必须具有@controlleradvice--定义应用于所有@requestmappings@exceptionhandler所需的。

@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来覆盖任何异常。

@SpringBootApplication
@EnableWebMvc
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配置SpringBoot应用程序,那么您需要添加以下属性,而不是在main方法中配置DispatcherServlet(感谢@mengchengfeng):

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
 类似资料:
  • http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd“> 我不明白该如何解决这件事,请帮帮我

  • 试图从开源android应用程序构建签名apk,但链接出错https://jcenter.bintray.com/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.pom无法访问 我尝试手动将此链接放到我的浏览器中,并在重定向到https://repo.jfrog.org/artifactory/libs-release-bi

  • 问题内容: 我得到的是一个错误的说法 这是文件内的代码 这是我收到的控制台消息(加上3次刷新页面的尝试): 关于可能出什么问题的任何建议? 问题答案: 你太早了: 这是在你的任何路由被注册之前执行的。将这两行到结束你的文件。 接下来,你输入的第一行不正确: 没有功能;应该这样。

  • 我指的是一个问题,已经被问了很多次,但其他地方发布的解决方案没有解决我的问题ie Socket.io.js找不到。 错误消息为 获取http://127.0.0.1:3000/socket.io/socket.io.js 404 一些附加信息:在我的app.js中:我引用了服务器套接字 '/javascripts/sockets/client.js'是我的客户端套接字:

  • 我是Spring MVC的新手。在尝试基本程序时,我面临404错误页面。 Web.xml myDemoApp servletConfid。xml 控制器类 JSP页面 使用的URL: http://localhost/8050/springMVCDemo/getQuote.html 文件夹结构:[在此输入图像描述][1] 请告诉我这个错误的解决方法。

  • 这是我的nginx配置文件。 默认情况下。conf,第一个位置用于访问/usr/share/nginx/html目录,当我访问http://47.91.152.99.但是,当我为目录/usr/share/nginx/public directory添加一个新位置时,nginx会在我访问时返回404页http://47.91.152.99/test. 那么,到底是怎么回事呢?我误用nginx的指令吗