スプリングブートレストサービスを利用できます。パスが間違っている場合は何も返しません。応答なし。同時に、エラーもスローしません。理想的には、404 not foundエラーが予想されました。
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 not found応答をスローするために他に何をする必要がありますか
私はたくさんのスレッドを参照しましたが、誰もこの問題に直面していません。
これが私のメインアプリケーションクラスです
@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;
}
}
解決策は非常に簡単です。
Firstすべてのエラーケースを処理するコントローラーを実装する必要があります。このコントローラには@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
は、Springがリクエストを委任できない場合に生成される例外です(404ケース)。 Throwable
を指定して、例外を上書きすることもできます。
2番目 404の場合に例外をスローするようにSpringに指示する必要があります(ハンドラーを解決できませんでした):
@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"
}
[〜#〜] update [〜#〜]:application.properties
を使用してSpringBootアプリケーションを構成する場合、DispatcherServlet
を構成する代わりに、次のプロパティを追加する必要があります主な方法(@mengchengfengに感謝):
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
これは古い質問であることは承知していますが、メインクラスではなくコードでDispatcherServlet
を構成する別の方法があります。別の@Configuration
クラスを使用できます。
@EnableWebMvc
@Configuration
public class ExceptionHandlingConfig {
@Autowired
private DispatcherServlet dispatcherServlet;
@PostConstruct
private void configureDispatcherServlet() {
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
}
}
これは@EnableWebMvc
アノテーションなしでは機能しないことに注意してください。