运行Intellij时查看JSON响应/请求

时间:2017-05-24 20:52:08

标签: java spring intellij-idea spring-boot

我从IntelliJ 2017.1.2的两个实例调试了两个服务。服务A向服务B提交json请求。两个服务都是使用REST调用的Spring-Boot。

服务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显示消息:

  

无法读取文档:无法识别的令牌“丢失”:正在等待   ('true','false'或'null')在[来源:   java.io.PushbackInputStream@7d005eb; line:1,column:9]   com.fasterxml.jackson.core.JsonParseException:无法识别的令牌   '失踪':期待('真','假'或'无效')[资料来源:   java.io.PushbackInputStream@7d005eb; line:1,column:9]

我没有任何堆栈跟踪,并且通过代码单步执行并没有向我显示问题。我试图找到一种方法来检查即将离开服务B的JSON,以便我可以看到正在使用的内容,因为这似乎导致了杰克逊的问题。无论如何在IntelliJ中查看此内容?如果我可以从服务A发送JSON,我可以重新创建Postman的呼叫,但我似乎无法跟踪离开服务A的实际json。

如果重要,我在OS X上使用Spring-Boot 1.3.5和Java 8

更新

我根据Patrick Bay的建议将以下内容添加到服务A中:

@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] o.s.web.client.RestTemplate
  :将[com.common.invoice.InvoiceRequest@44471e8e]写成   “application / json; charset = UTF-8”使用   [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@610fefeb]   DEBUG 74188 --- [nio-8081-exec-3] o.s.web.client.RestTemplate
  :结果是“http://localhost:8998/office/1/invoice”的POST请求   在200(null)DEBUG 74188 --- [nio-8081-exec-3]   o.s.web.client.RestTemplate:读取[类   com..common.invoice.InvoiceResponse]作为“application / json”使用   [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@610fefeb]   ERROR 74188 --- [nio-8081-exec-3] c.finance.Connector:不能   阅读文档:无法识别的标记'丢失':期待('真',   'false'或'null')

我还尝试在我的Service B JwtAuthenticationTokenFilter中检查HttpRequest。我试过通过它导航,但我没有看到我发送的实际身体。我确实在请求中看到了正确的URL,但是一旦过滤器成功处理它,就永远不会到达实际端点(“/ office / 1 / invoice”),因为我认为服务B爆炸了

1 个答案:

答案 0 :(得分: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