2016-04-20 14 views
7

Ich habe eine funktionierende Feder Boot Rest Service. Wenn der Pfad falsch ist, gibt er nichts zurück. Keine Antwort überhaupt. Zur gleichen Zeit wirft es auch keinen Fehler. Im Idealfall habe ich einen Fehler 404 nicht gefunden erwartet.Spring Boot Rest - Wie konfiguriert man 404 - Ressource nicht gefunden

bekam ich einen GlobalErrorHandler

@ControllerAdvice 
public class GlobalErrorHandler extends ResponseEntityExceptionHandler { 

} 

Es diese Methode in ResponseEntityExceptionHandler

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

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

ich error.whitelabel.enabled=false in meiner Eigenschaften markiert haben

Was muss ich für diesen Dienst tun ein werfen 404 nicht gefundene Antwort zurück zu den Clients

Ich habe viele Threads angesprochen und sehe diesen Ärger gar nicht.

Das ist meine Hauptanwendungsklasse

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

Antwort

13

Die Lösung ist recht einfach:

Erste Sie müssen die Regler implementieren, die alle Fehlerfälle behandelt. Dieser Controller muss @ControllerAdvice haben - erforderlich, um @ExceptionHandler zu definieren, die für alle @RequestMappings gelten.

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

Ausnahme Geben Sie Antwort in @ExceptionHandler außer Kraft setzen möchten. NoHandlerFoundException ist eine Ausnahme, die generiert wird, wenn Spring keine Anfrage delegieren kann (404). Sie können auch Throwable angeben, um Ausnahmen zu überschreiben.

Zweite Sie brauchen Frühling zu sagen, außer im Fall von 404 zu werfen (nicht Handler lösen könnte):

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

Ergebnis, wenn ich nicht URL definiert verwenden

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

Danke. Selbst nachdem ich diese Änderung vorgenommen habe, sehe ich immer noch keine Antwort. Bitte helfen !!! – Shiv

+0

Können Sie Ihre Filterimplementierung posten? CorrelationHeaderFilter wird jede Anfrage bearbeiten und ist möglicherweise der Grund, warum es nicht für Sie funktioniert. Ich habe mit einem Code getestet, der sehr nahe an deinem Code ist, und es funktioniert, wenn ich einen Kommentar einfüge, '@EnableWebMvc' hinzufüge und nicht benötigte Annotationen wie '@EnableSwagger', '@@ EnableJpaRepositories', '@@ EnableAspectJAutoProxy' kommentieren. –

+0

ich einfache Anwendung veröffentlichen können auf GitHub, wenn Sie –

Verwandte Themen