Yeni cevap (2016-04-20)
Spring Boot 1.3.1'i Kullanın
Yeni Adım 1 - Uygulamaya aşağıdaki özellikleri eklemek kolay ve daha az müdahaleci: properties:
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
Mevcut DispatcherServlet örneğini değiştirmekten çok daha kolay (aşağıdaki gibi)! - JO '
Tam bir RESTful Uygulaması ile çalışıyorsanız, statik önyüklemelerin otomatik eşlemesini devre dışı bırakmak çok önemlidir, çünkü Spring Boot'un statik kaynakları işlemek için varsayılan yapılandırmasını kullanıyorsanız, kaynak işleyici isteği işleyecektir (en son sipariş edilir ve / ** Bu, uygulamadaki başka bir işleyici tarafından ele alınmayan tüm istekleri aldığını gösterir), böylece dağıtımcı sunucu uygulaması bir istisna atma şansı elde etmez.
Yeni Cevap (2015-12-04)
Spring Boot 1.2.7 Kullanılması
Yeni Adım 1 - "throExceptionIfNoHandlerFound" bayrağını ayarlamak için çok daha az müdahaleci bir yol buldum. Uygulama başlatma sınıfınızdaki aşağıdaki DispatcherServlet değiştirme kodunu (Adım 1) bununla değiştirin:
@ComponentScan()
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {
private static Logger LOG = LoggerFactory.getLogger(MyApplication.class);
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(MyApplication.class, args);
DispatcherServlet dispatcherServlet = (DispatcherServlet)ctx.getBean("dispatcherServlet");
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
}
Bu durumda, Spring Boot çerçevesinin otomatik yapılandırmasını koruyan mevcut DispatcherServlet üzerindeki bayrağı ayarlıyoruz.
Bulduğum bir şey daha @EnableWebMvc ek açıklaması Spring Boot için ölümcül. Evet, bu ek açıklama, aşağıda açıklanan tüm denetleyici istisnalarını yakalama gibi şeyleri mümkün kılar, ancak Spring Boot'un normalde sağlayacağı yararlı otomatik yapılandırmanın LOT'unu da öldürür. Spring Boot kullanırken bu notu çok dikkatli kullanın.
Orijinal Yanıt:
Çok daha fazla araştırma ve burada yayınlanan çözümler (takip için teşekkürler!) Ve Bahar kodu içine az miktarda çalışma zamanı izleme sonra, nihayet tüm İstisnaları (Hatalar değil, ama okuma) işleyecek bir yapılandırma buldum sonra 404'ler dahil.
Adım 1 - SpringBoot'a "işleyici bulunamadı" durumlarında MVC'yi kullanmayı bırakmasını söyleyin. Spring'in istemciye "/ error" görünümüne yönlendirmek yerine bir istisna atmasını istiyoruz. Bunu yapmak için, yapılandırma sınıflarınızdan birinde bir girişinizin olması gerekir:
// NEW CODE ABOVE REPLACES THIS! (2015-12-04)
@Configuration
public class MyAppConfig {
@Bean // Magic entry
public DispatcherServlet dispatcherServlet() {
DispatcherServlet ds = new DispatcherServlet();
ds.setThrowExceptionIfNoHandlerFound(true);
return ds;
}
}
Bunun dezavantajı, varsayılan dağıtıcı sunucu uygulamasının yerini almasıdır. Bu henüz bizim için bir sorun olmadı, hiçbir yan etki veya uygulama problemi ortaya çıkmadı. Başka nedenlerden dolayı dağıtım programı sunucu uygulamasıyla başka bir şey yapacaksanız, burası bunları yapmanız gereken yerdir.
Adım 2 - Şimdi, bahar önyükleme, hiçbir işleyici bulunmadığında bir istisna atar, bu istisna, birleşik bir istisna işleyicisindeki diğerleriyle ele alınabilir:
@EnableWebMvc
@ControllerAdvice
public class ServiceExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Throwable.class)
@ResponseBody
ResponseEntity<Object> handleControllerException(HttpServletRequest req, Throwable ex) {
ErrorResponse errorResponse = new ErrorResponse(ex);
if(ex instanceof ServiceException) {
errorResponse.setDetails(((ServiceException)ex).getDetails());
}
if(ex instanceof ServiceHttpException) {
return new ResponseEntity<Object>(errorResponse,((ServiceHttpException)ex).getStatus());
} else {
return new ResponseEntity<Object>(errorResponse,HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@Override
protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
Map<String,String> responseBody = new HashMap<>();
responseBody.put("path",request.getContextPath());
responseBody.put("message","The URL you have reached is not in service at this time (404).");
return new ResponseEntity<Object>(responseBody,HttpStatus.NOT_FOUND);
}
...
}
Burada "@EnableWebMvc" ek açıklamasının önemli olduğunu unutmayın. Görünüşe göre bunların hiçbiri onsuz çalışmıyor. Ve işte bu - Bahar önyükleme uygulamanız şimdi yukarıdaki işleyici sınıfında 404'ler de dahil olmak üzere tüm istisnaları yakalayacak ve onlarla istediğiniz gibi yapabilirsiniz.
Son bir nokta - atılan Hataları yakalamak için bunu elde etmek için bir yol gibi görünmüyor. Hataları yakalamak ve yukarıdaki kod sonra başa çıkabilirim istisnalar açmak için yönlerini kullanarak tuhaf bir fikrim var, ama henüz bunu gerçekten denemek için zaman yoktu. Umarım bu birine yardımcı olur.
Herhangi bir yorum / düzeltme / geliştirme takdir edilecektir.