2016-04-20 35 views
7

Ho ottenuto un servizio di supporto all'avvio a molla funzionante. Quando il percorso è sbagliato non restituisce nulla. Nessuna risposta. Allo stesso tempo non genera errori neanche. Idealmente mi aspettavo un errore 404 non trovato.Spring Boot Rest - Come configurare 404 - risorsa non trovata

ho ottenuto un GlobalErrorHandler

@ControllerAdvice 
public class GlobalErrorHandler extends ResponseEntityExceptionHandler { 

} 

C'è questo metodo in ResponseEntityExceptionHandler

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

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

Ho segnato error.whitelabel.enabled=false nelle mie proprietà

Che altro devo fare per questo servizio di gettare un 404 risposta non trovata ai clienti

Ho fatto riferimento a molti thread e non vedo questo problema affrontato da nessuno.

Questo è il mio principale classe di applicazione

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

risposta

13

La soluzione è piuttosto semplice:

Prima è necessario implementare il controller che gestirà tutti i casi di errore. Questo controller deve avere @ControllerAdvice - necessario per definire @ExceptionHandler valido per tutti @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"); 
    } 
} 

Fornire eccezione si desidera ignorare la risposta in @ExceptionHandler. NoHandlerFoundException è un'eccezione che verrà generata quando Spring non sarà in grado di delegare la richiesta (caso 404). È anche possibile specificare Throwable per sovrascrivere eventuali eccezioni.

Seconda Dovete dire primavera gettare eccezione nel caso di 404 (non poteva risolvere handler):

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

Risultato quando ho uso non definito URL

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

Grazie. Anche dopo aver fatto questo cambiamento, non vedo ancora nessuna risposta. Per favore aiuto!!! – Shiv

+0

Puoi pubblicare l'implementazione del filtro? CorrelationHeaderFilter gestirà ogni richiesta e potrebbe essere il motivo per cui non funziona per te. Ho provato con un codice molto vicino al tuo e funziona se commento il filtro, aggiungo '@EnableWebMvc' e commento annotazioni non necessarie per esso come '@EnableSwagger', '@@ EnableJpaRepositories', '@@ EnableAspectJAutoProxy'. –

+0

Posso postare una semplice applicazione su github se vuoi –