programing

스프링 부트 레스트 - 404 구성 방법 - 리소스를 찾을 수 없음

powerit 2023. 7. 7. 21:10
반응형

스프링 부트 레스트 - 404 구성 방법 - 리소스를 찾을 수 없음

워킹 스프링 부츠 레스트 서비스를 받았습니다.경로가 잘못되면 아무것도 반환하지 않습니다.전혀 응답이 없습니다.동시에 오류도 발생하지 않습니다.이상적으로는 404 not found 오류를 예상했습니다.

Global Error Handler를 받았습니다.

@ControllerAdvice
public class GlobalErrorHandler extends ResponseEntityExceptionHandler {

}

ResponseEntity에 이 메서드가 있습니다.예외 처리기

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

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

표시했습니다.error.whitelabel.enabled=false내 소유지에서

404 찾을 수 없는 응답을 클라이언트에 다시 보내려면 이 서비스를 사용하려면 어떻게 해야 합니까?

저는 많은 스레드를 참조했고 이 문제가 누구에게도 발생하지 않았습니다.

이것은 나의 주요 응용 프로그램 수업입니다.

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

솔루션은 매우 간단합니다.

먼저 모든 오류 사례를 처리할 컨트롤러를 구현해야 합니다.이 컨트롤러는 다음을 수행해야 합니다.@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.NoHandlerFoundExceptionSpring이 요청을 위임할 수 없을 때 생성되는 예외입니다(404건).지정할 수도 있습니다.Throwable모든 예외를 무시합니다.

번째로 Spring에게 404(핸들러를 확인할 수 없음)의 경우 예외를 던지라고 말해야 합니다.

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

업데이트: 다음을 사용하여 SpringBoot 응용 프로그램을 구성하는 경우application.properties그런 다음 구성하는 대신 다음 속성을 추가해야 합니다.DispatcherServlet주요 방법으로(@pxchengengfeng 덕분):

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

이것이 오래된 질문이라는 것을 알지만 여기에 구성할 다른 방법이 있습니다.DispatcherServlet코드는 있지만 메인 클래스는 아닙니다.별도로 사용할 수 있습니다.@Configuration클래스:

@EnableWebMvc
@Configuration
public class ExceptionHandlingConfig {

    @Autowired
    private DispatcherServlet dispatcherServlet;

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

이것이 없이는 작동하지 않는다는 것을 제발 하지 마세요.@EnableWebMvc주석

  1. 속성 파일에 추가합니다.

     spring:
        mvc:
          throw-exception-if-no-handler-found: true
        web:
          resources:
            add-mappings: false
    
  2. 당신의@ControllerAdvice클래스 추가:

    @ExceptionHandler(NoHandlerFoundException.class)
       public ResponseEntity<Object> handleNoHandlerFound404() {
       return new ResponseEntity<>(HttpStatus.BAD_REQUEST);;
    }
    

언급URL : https://stackoverflow.com/questions/36733254/spring-boot-rest-how-to-configure-404-resource-not-found

반응형