2016-03-07 31 views
10

Spring Boot Aktüatörü Trace giriş/çıkış HTTP param, başlık, kullanıcı, vb. Yakalamak için iyi bir iş yapar. Ayrıca, HTTP yanıtının gövdesini yakalamak için genişletmek istiyorum. web katmanına giren ve çıkan şey. TraceProperties'a bakıldığında, yanıt gövdesinin yakalanmasını yapılandırmanın bir yolu var gibi görünmüyor. Cevap gövdesini geri göndermekte olan karakter akışını bozmadan yakalamak için "güvenli" bir yol var mı?Spring Boot Aktüatörün İzine JSON yanıt gövdesi nasıl eklenir?

cevap

2

Son zamanlarda, Bahar Boot aktüatör en trace son nokta özelleştirmesiyle ilgili bir blog post yazmış ve Aktüatör oynarken, ben response body izlemek için desteklenen özelliklerin biri olmadığını tür şaşırdı.

Bu özelliğe ihtiyacım olabileceğini düşündüm ve Logback'in TeeFilter'u sayesinde hızlı bir çözüm buldum. Yanıtın çıktı akışını çoğaltmak için, çok fazla inceleme yapmadan TeeHttpServletResponse ve TeeServletOutputStream kopyaladım ve kullandım. Eğer trace bitiş noktası hizmet veren JSON responseBody görebilirsiniz, Şimdi

@Component 
public class RequestTraceFilter extends WebRequestTraceFilter { 

    RequestTraceFilter(TraceRepository repository, TraceProperties properties) { 
     super(repository, properties); 
    } 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     TeeHttpServletResponse teeResponse = new TeeHttpServletResponse(response); 

     filterChain.doFilter(request, teeResponse); 

     teeResponse.finish(); 

     request.setAttribute("responseBody", teeResponse.getOutputBuffer()); 

     super.doFilterInternal(request, teeResponse, filterChain); 
    } 

    @Override 
    protected Map<String, Object> getTrace(HttpServletRequest request) { 
     Map<String, Object> trace = super.getTrace(request); 

     byte[] outputBuffer = (byte[]) request.getAttribute("responseBody"); 

     if (outputBuffer != null) { 
      trace.put("responseBody", new String(outputBuffer)); 
     } 

     return trace; 
    } 
} 

:

Sonra ben blog yayınında açıklandığı gibi, gibi WebRequestTraceFilter uzatıldı.

+0

Bu cevabı kullanmayı denedim. Tam kodu yukarıdan ve iki sınıftan TeeHttpServletResponse ve TeeServletOutputStream kopyalayın. Şimdi/trace bana "Response yanıtı verildikten sonra sendError() öğesini çağırılamıyor" ve "diğer herhangi bir kaynak bana" sözdizimi hatası "ile 200 verir. Bahar kayıtlarında herhangi bir hata göremiyorum – isADon