irpas技术客

feign调用不通问题,JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only reg

网络 1087

?背景:feign调用不通,报错,困了我快一个月!!!可恶,中间花了两天解决,把百度都试了一遍,都没有用,都快哭了,现在说下解决过程。

????????①开始我打开了日志进行进一步查看报错信息,需要在feign使用配置文件中加入日志级别,日志级别是FULL,并在配置文件中也加入日志级别。

?

?

?????????②然后发现报错404 not found,开始以为是参数不够,被调用为三个参数,调用时传两个参数,加上了之后还是报错,然后发现是注解用错了,之前用的是@PathVariable(复制过来没有改),使用@RequestParam后错误改变(低级错误)。

? ? ? ? ③报错:?nested exception is com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens ?at [Source: (ByteArrayInputStream); line: 1, column: 2]。

? ? ? ? ④然后feign调用接口,使用String接收,把字符串打印出来,?发现乱码了???

?????????还发现传回来是二进制数据??

????????然后开始了疯狂的百度中,中间试了无数次,各种加什么配置,去掉压缩之类的都不行,还有加过滤器什么的也不行。

? ? ? ? 最后终于在一个大哥的文章中发现了答案,他和我一样是打印出来发现乱码,这个问题就是gzip接收到的还是压缩数据,所以乱码,还是试了一下他说没用的配置,结果对我有用!!!!!(他下面真正对她有用的方法对我没用,也是加拦截器)

线上问题处理-feign调用报错(Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) )_im_ayday的博客-CSDN博客_feign调用报错处理

?答案:在配置文件中加入feign.compression.response.useGzipDecoder为true即可。

? ? ? ? ⑤乱码的事情没了,发现只有中文乱码了,靠!!!!!!又整了我好久好久,百度的所有方案都试过了,还看了feign日志所有参数,好像也没问题的,人都快哭了,终于找到了解决方案。

@Configuration public class FeignConfig implements RequestInterceptor { @Autowired private ObjectFactory<HttpMessageConverters> messageConverters; @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(new SpringEncoder(messageConverters)); } @Bean public Decoder feignDecoder() { return new ResponseEntityDecoder(new SpringDecoder( () -> { FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter() { @Override public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { Object result=null; if ("java.lang.String".equals(type.getTypeName())) { result= StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("utf8")); } else { result=super.read(type, contextClass, inputMessage); } return result; } }; return new HttpMessageConverters(fastConverter); })); } @Override public void apply(RequestTemplate requestTemplate) { try { ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); if (null != servletRequestAttributes) { HttpServletRequest request = servletRequestAttributes.getRequest(); // 获取所有头文件信息的key Enumeration<String> headerNames = request.getHeaderNames(); if (null != headerNames) { while (headerNames.hasMoreElements()) { // 获取头文件的key和value String headerName = headerNames.nextElement(); String headerValue = request.getHeader(headerName); // 跳过content-length,不然可能会报too many bites written问题 if ("content-length".equalsIgnoreCase(headerName)) { continue; } // 将令牌数据添加到头文件中,当用feign调用的时候,会传递给下一个微服务 requestTemplate.header(headerName, headerValue); } } } } catch (Exception e) { e.printStackTrace(); } } @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }

参考:Feign乱码 - 知乎

答案:加了个解码器,转成utf8就可以了。?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #feign调不通 #②然后发现报错404 #not