我从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爆炸了
答案 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