2016-04-20 17 views
7

Mam działającą usługę odpoczynku wiosennego. Gdy ścieżka jest błędna, nic nie zwraca. Brak odpowiedzi W ogóle. W tym samym czasie nie powoduje również błędu. Idealnie spodziewam się błędu 404 nie znaleziono.Spring Boot Rest - jak skonfigurować 404 - nie znaleziono zasobu

Mam GlobalErrorHandler

@ControllerAdvice 
public class GlobalErrorHandler extends ResponseEntityExceptionHandler { 

} 

Jest to metoda w ResponseEntityExceptionHandler

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

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

mam zaznaczone error.whitelabel.enabled=false w moich właściwości

Co jeszcze muszę zrobić dla tej usługi, aby rzucić Nie znaleziono odpowiedzi 404 dla klientów

Wymieniłem wiele wątków i nie widzę kłopotów, z którymi boryka się każdy.

To jest mój główny klasa aplikacja

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

Odpowiedz

13

Rozwiązanie jest dość proste:

Pierwszy trzeba wdrożyć kontroler, który będzie obsługiwać wszystkie przypadki błędów. Ten kontroler musi mieć @ControllerAdvice - wymagany do zdefiniowania @ExceptionHandler, które mają zastosowanie do wszystkich @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"); 
    } 
} 

Zapewnić wyjątek, który chcesz zastąpić odpowiedź w @ExceptionHandler. NoHandlerFoundException to wyjątek, który zostanie wygenerowany, gdy Spring nie będzie mógł przekazać żądania (przypadek 404). Możesz także określić Throwable, aby zastąpić wszelkie wyjątki.

drugie trzeba powiedzieć Wiosna rzucać wyjątek w przypadku 404 (nie mógł rozwiązać obsługi):

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

Wynik kiedy używam non zdefiniowane URL

{ 
    "errorCode": "custom_404", 
    "errorMessage": "message for 404 error code" 
} 
+0

Dziękuję. Nawet po wykonaniu tej zmiany nadal nie widzę żadnej reakcji. Proszę pomóż!!! – Shiv

+0

Czy możesz opublikować implementację filtra? CorrelationHeaderFilter obsłuży każde żądanie i może być przyczyną tego, że nie działa ono dla ciebie. Testowałem z kodem bardzo zbliżonym do twojego i działa on, gdy filtruję komentarz, dodajemy "@EnableWebMvc" i komentuję niepotrzebną adnotację, np. "@EnableSwagger", "@@ EnableJpaRepositories", "@@ EnableAspectJAutoProxy". –

+0

Mogę wysłać prostą aplikację do github jeśli chcesz –

Powiązane problemy