2016-04-20 7 views
7

मुझे एक काम कर रहे वसंत बूट आराम सेवा मिल गई। जब पथ गलत होता है तो यह कुछ भी वापस नहीं करता है। कोई प्रतिक्रिया नहीं। साथ ही यह त्रुटि भी फेंक नहीं देता है। आदर्श रूप से मुझे उम्मीद है कि 404 त्रुटि नहीं मिली है।स्प्रिंग बूट रेस्ट - 404 को कॉन्फ़िगर कैसे करें - संसाधन नहीं मिला

मैं एक 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 ग्राहकों को प्रतिक्रिया नहीं मिली

मैंने बहुत सारे धागे को संदर्भित किया और किसी को भी इस समस्या का सामना नहीं किया।

यह मेरा मुख्य आवेदन वर्ग

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

उत्तर

13

समाधान बहुत आसान है है:

पहले आप नियंत्रक कि सभी त्रुटि मामलों को संभाल लेंगे लागू करना होगा। इस नियंत्रक के पास @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 एक अपवाद है जो तब उत्पन्न होगा जब वसंत अनुरोध (404 मामले) का प्रतिनिधि नहीं दे पाएगा। आप किसी भी अपवाद को ओवरराइड करने के लिए Throwable भी निर्दिष्ट कर सकते हैं। जब मैं गैर यूआरएल

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

परिभाषित का उपयोग धन्यवाद

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

परिणाम:

दूसरा आप (हैंडलर हल नहीं कर सका) 404 के मामले में अपवाद फेंकने के लिए स्प्रिंग बताने के लिए की जरूरत है। इस बदलाव को करने के बाद भी मुझे कोई प्रतिक्रिया नहीं दिखाई दे रही है। कृपया सहायता कीजिए!!! – Shiv

+0

क्या आप अपना फ़िल्टर कार्यान्वयन पोस्ट कर सकते हैं? सहसंबंध HeaderFilter प्रत्येक अनुरोध को संभालेगा और यही वजह है कि यह आपके लिए काम नहीं करता है। मैंने आपके बहुत करीब एक कोड के साथ परीक्षण किया है और अगर मैं फ़िल्टर पर टिप्पणी करता हूं तो यह काम करता है, '@EnableWebMvc' जोड़ें, और इसके लिए टिप्पणियों की आवश्यकता नहीं है जैसे '@EnableSwagger', '@@ EnableJpaRepositories', '@@ EnableAspectJAutoProxy'। –

+0

यदि आप –

संबंधित मुद्दे