Spring-web-4.3.3'ü içeren Spring Boot 1.4.1 kullanıyorum. @ControllerAdvice
ile açıklanmış bir sınıfım var ve hizmet kodu tarafından atılan istisnaları işlemek için @ExceptionHandler
ile açıklamalı yöntemler. Bu özel durumları ele alırken, PUT ve POST işlemlerinin isteğinin bir parçası olan @RequestBody
'u günlüğe kaydetmek istiyorum. Bu nedenle, sorunumda neden olan istek gövdesini tanılama için çok önemli olan sorunu görebiliyorum. yöntemleri için yöntem imzası, HttpServletRequest
dahil olmak üzere çeşitli şeyleri içerebilir. İstek gövdesi, buradan getInputStream()
veya getReader()
aracılığıyla alınabilir, ancak benim denetleyici yöntemlerim tümüyle "@RequestBody Foo fooBody"
gibi istek gövdesini ayrıştırıyorsa, HttpServletRequest's
giriş akışı veya okuyucu istisna işleyici yöntemim çağrıldığında zaten kapalıdır. Esasen istek gövdesi, here açıklandığı gibi, Spring tarafından zaten okunmuştur. Servletlerle çalışan, talep gövdesinin yalnızca bir kez okunabileceği yaygın bir sorundur.@ExceptionHandler'da (Spring REST) @RequestBody'yi alma
@RequestBody
Ne yazık ki bunu kullanabiliyor olsaydı, istisna eylemci yöntemi için kullanılabilen seçeneklerden biri değil.
Özel durum işleyici yöntemine InputStream
ekleyebilirim, ancak bu HttpServletRequest'in InputStream ile aynı şeyle sonuçlanır ve bu nedenle de aynı sorunla karşılaşır.
Güncel isteği almayı denediğim başka bir numara olan ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
ile şu anki isteği almayı denedim, ancak bu durum, Spring'in istisna işleyici yöntemine geçişi ile aynı HttpServletRequest olmasıyla sonuçlanır ve aynı sorunla karşılaşır.
this ve this gibi birkaç çözüm hakkında, filtre zincirine isteklerin içeriğini okuyacak ve bunları bir kez daha okunabilmeleri için önbelleğe alacak özel bir istek sarmalayıcısı eklenmesini içerdiğini okudum. Bu çözümü sevmiyorum çünkü tüm filtreyi/istek/yanıt zincirini (ve potansiyel olarak performans veya kararlılık sorunlarını ortaya koymak için) sadece günlüğe kaydetme uygulamak için istemiyorum ve yüklenen belgeler gibi büyük isteklerim varsa Yaparım, bunu hafızada saklamak istemiyorum. Ayrıca, muhtemelen sadece onu bulabildiysem muhtemelen @RequestBody
bir yere önbelleğe sahiptir.
Tesadüfen birçok çözüm, ContentCachingRequestWrapper
Spring sınıfını kullanmanızı önerir, ancak deneyimlerimde bu işe yaramıyor. Belgelendirilmemenin yanı sıra, kaynak koduna bakmak, yalnızca parametreleri değil, istek gövdesini önbelleğe alır. İstek sınıfını bu sınıftan almaya çalışırken her zaman boş bir dizeyle sonuçlanır.
Bu yüzden kaçırmış olabileceğim diğer seçenekleri arıyorum. okuduğunuz için teşekkürler.
Yapmak istediğiniz şeyi yapmak için hızlı yerleşik bir çözüm yoktur. Yay talep gövdesini hiçbir yerde önbelleğe almaz. "HandlerMapping" ve "HttpServletRequestWrapper" öğelerini kendiniz oluşturabilirsiniz. –