web-dev-qa-db-ja.com

Spring Boot Rest-404の設定方法-リソースが見つかりません

スプリングブートレストサービスを利用できます。パスが間違っている場合は何も返しません。応答なし。同時に、エラーもスローしません。理想的には、404 not foundエラーが予想されました。

GlobalErrorHandlerを取得しました

@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;
    }
}
11
juniorbansal

解決策は非常に簡単です。

Firstすべてのエラーケースを処理するコントローラーを実装する必要があります。このコントローラには@ControllerAdviceが必要です-すべての@ExceptionHandlerに適用される@RequestMappingsを定義するために必要です。

@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を指定して、例外を上書きすることもできます。

2番目 404の場合に例外をスローするようにSpringに指示する必要があります(ハンドラーを解決できませんでした):

@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"
}

[〜#〜] update [〜#〜]application.propertiesを使用してSpringBootアプリケーションを構成する場合、DispatcherServletを構成する代わりに、次のプロパティを追加する必要があります主な方法(@mengchengfengに感謝):

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
22
Ilya Ovesnov

これは古い質問であることは承知していますが、メインクラスではなくコードでDispatcherServletを構成する別の方法があります。別の@Configurationクラスを使用できます。

@EnableWebMvc
@Configuration
public class ExceptionHandlingConfig {

    @Autowired
    private DispatcherServlet dispatcherServlet;

    @PostConstruct
    private void configureDispatcherServlet() {
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
    }
}

これは@EnableWebMvcアノテーションなしでは機能しないことに注意してください。

1
Alternatic