我們通過Spring MVC公開了REST服務。我們使用HandlerExceptionResolver
來記錄異常。目前,我們記錄以下內容:如何登錄RESTful發佈數據?
- 異常及其堆棧跟蹤
- 的URL
- 請求頭
這將使調試更加容易,如果我們也可以登錄該JSON後的數據作爲好。有關如何獲得此建議的任何建議?
我們通過Spring MVC公開了REST服務。我們使用HandlerExceptionResolver
來記錄異常。目前,我們記錄以下內容:如何登錄RESTful發佈數據?
這將使調試更加容易,如果我們也可以登錄該JSON後的數據作爲好。有關如何獲得此建議的任何建議?
您需要一個過濾器,以便在讀取時保存請求主體,並在以後將保存的數據提供給異常記錄器。
春天包含AbstractRequestLoggingFilter
做類似的事情。雖然它不直接適用於您的問題,但您可以將其用作實施自己的過濾器的參考。
有沒有簡單的方法來記錄請求/響應的有效負載。您可以使用Java Web過濾器攔截所有請求和響應,並從流中讀取JSON數據。但是有一個問題,當你從流中讀取數據時,實際的數據將從流中被耗盡。
因此,您必須實現實際的請求和響應對象的包裝。只有請求響應的複製版本纔會被記錄。我們已經實施了類似的解決方案如下一樣,它滿足了我們的要求:
http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431
http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/
添加這代表應用程序的配置類:
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.filter.AbstractRequestLoggingFilter;
....
@Bean
public Filter loggingFilter(){
AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() {
@Override
protected void beforeRequest(HttpServletRequest request, String message) {
System.out.println("beforeRequest: " +message);
}
@Override
protected void afterRequest(HttpServletRequest request, String message) {
System.out.println("afterRequest: " +message);
}
};
f.setIncludeClientInfo(true);
f.setIncludePayload(true);
f.setIncludeQueryString(true);
f.setBeforeMessagePrefix("BEFORE REQUEST [");
f.setAfterMessagePrefix("AFTER REQUEST [");
f.setAfterMessageSuffix("]\n");
return f;
}
你可能要註釋掉
f.setIncludePayload(true);
如果你使用Spring 4.1.3+(見SPR-12477),請確保您的過濾器映射到你的MVC調度Servlet和不'/* url-pattern>,否則你的請求將不會被封裝在基本的ContentCachingRequestWrapper中。 –
@LászlóvandenHoek,你能詳細說明一下嗎?我不跟着你。我正在使用'ContentCachingRequestWrapper',但請求主體始終是一個空字符串。 –
@AbhijithMadhav過濾器通過將它們映射到URL模式或servlet來啓用。我的意思是,你需要確保你將'AbstractRequestLoggingFilter'映射到調度器,而不是'/ *'URL模式。 –