2017-05-24 37 views
0

我有兩個服務正在從IntelliJ 2017.1.2的兩個實例中進行調試。服務A向服務B提交一個json請求。這兩個服務都是使用REST調用的Spring-Boot。查看運行時的JSON響應/請求Intellij

服務A對職位:

ResponseEntity<InvoiceResponse> response = 
          restTemplate.postForEntity(invoiceUrl, request, InvoiceResponse.class); 

服務B有一個端點:

@RequestMapping(value = "/office/{officeId}/invoice", method = RequestMethod.POST) 
    @ResponseBody 
    public ResponseEntity createInvoice(@RequestBody InvoiceRequest invoiceRequest, @PathVariable("officeId") long officeId) { 
...} 

但我得到一個JWT過濾器,截取該請求,並處理它成功(我已經通過確認斷點):

public class JwtAuthenticationTokenFilter extends GenericFilterBean { 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, 
        ServletException { 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    String authToken = httpRequest.getHeader(this.tokenHeader); 
    String username = jwtTokenUtil.getUsernameFromToken(authToken); 
    if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { 
      UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); 
      if (jwtTokenUtil.validateToken(authToken, userDetails)) { 
       UsernamePasswordAuthenticationToken 
           authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); 
       authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest)); 
       SecurityContextHolder.getContext().setAuthentication(authentication); 
      } 
     } 
     chain.doFilter(request, response); 
    } 

這似乎正常退出,因爲我沒有看到日誌中的任何錯誤。然而,在的IntelliJ服務A顯示消息:

無法讀取文件:無法識別的記號「缺失」:期待 (「真」,「假」或「空」)在[來源: 的Java。 [email protected];行:1,列:9] com.fasterxml.jackson.core.JsonParseException:無法識別的令牌 'Missing':在[Source: java.io上期待('true','false'或'null')。 PushbackInputStream @ 7d005eb;行:1,列:9]

我沒有任何堆棧跟蹤和步進通過代碼不顯示我的問題。我試圖找到一種方法來檢查JSON來/離開服務B,所以我可以看到正在使用,因爲這似乎是導致傑克遜問題。無論如何在IntelliJ中查看這個?如果我可以從服務A發送JSON,我可以重新創建Postman的調用,但我似乎無法跟蹤實際的JSON離開服務A。

如果它的事項,我使用的彈簧引導1.3.5和Java 8 OS X

UPDATE:

我增加了以下服務於每帕特里克灣建議:

@Bean 
public CommonsRequestLoggingFilter requestLoggingFilter() { 
    CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter(); 
    loggingFilter.setIncludeClientInfo(true); 
    loggingFilter.setIncludeQueryString(true); 
    loggingFilter.setIncludePayload(true); 
    return loggingFilter; 
} 

但我還沒有看到任何JSON幫我看看有什麼問題我的要求:

DEBUG 74188 --- [nio-8081-exec-3] osweb.client.RestTemplate
:將[[email protected]]寫爲 「application/json; charset = UTF-8」使用 [org.springfr[email protected]610fefeb] DEBUG 74188 --- [NIO-8081-EXEC-3] osweb.client.RestTemplate
:爲 「http://localhost:8998/office/1/invoice」 POST請求導致 在200(null)DEBUG 74188 --- [nio-8081-exec-3] osweb.client.RestTemplate:Reading [class com..common.invoice.InvoiceResponse] as「application/json」using [org。 springfr[email protected]610fefeb] 錯誤74188 --- [nio-8081-exec-3] c.finance。連接器:無法讀取 文件:無法識別的記號「缺失」:期待(「真」, 「假」或「空」)

我也試過在我的服務B JwtAuthenticationTokenFilter檢查的HttpRequest。我嘗試過導航,但我沒有看到我發送的實際身體。我確實在請求中看到了正確的url,但一旦過濾器成功處理它,實際端點(「/ office/1/invoice」)永遠不會到達,因爲我認爲服務B爆炸了

回答

0

要記錄傳入請求你可以使用CommonsRequestLoggingFilter在這裏看到更多的細節https://ivanursul.com/how-to-log-requests-and-their-payloads-in-spring/

添加到您的Spring配置文件:

@Bean 
public CommonsRequestLoggingFilter requestLoggingFilter() { 
    CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter(); 
    loggingFilter.setIncludeClientInfo(true); 
    loggingFilter.setIncludeQueryString(true); 
    loggingFilter.setIncludePayload(true); 
    return loggingFilter; 
} 

,這對您的應用程序屬性文件:

logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG 
+0

你也應該能夠通過檢查HttpRequest的調試JwtAuthenticationTokenFilter當檢查請求主體。 –

+0

也值得看看這個問題https://stackoverflow.com/questions/7952154/spring-resttemplate-how-to-enable-full-debugging-logging-of-requests-responses –

+0

這實際上並沒有顯示我的JSON請求或響應。我需要看到,所以我可以看到我的傑克遜映射是不正確的。 – sonoerin