解决JHipster Register5.x不能正确解析uaa的api docs的问题

最近在家,无法出门,研究分布式系统的架构。主要使用JHipster构建,而其中最关键的就是注册中心。github上面已经更新到6.1.1的版本,二我们上次使用的版本是3.2.4,我决定研究5.x的版本,于是拉取来5.0.0的源码进行修改、构建、部署、测试。但是在测试过程中遇到一个问题,就是3.x和4.x版本的注册中心都能正确解析uaa的接口文档,但是5.x和6.x都不行,一直有以下提示

401 : {"error":"invalid_token","error_description":"Cannot convert access token to JSON","basePath":"/services/uaa/uaa:c1266900a5f688968eec45ff2be4872f"} http://localhost:8761/services/uaa/uaa:c1266900a5f688968eec45ff2be4872f/v2/api-docs

虽然接口文档在swagger中不能正常显示并不影响服务的使用,但是看着很不舒服,团队开发也不方便,更重要的是,我有强迫症,遇到问题总要把它解决掉。但是要去完整研究JHipster Registry的源代码那就有点恐怖了,毕竟我还有其他事儿要做。本来就决定干脆就以4.x这个版本做就好来,转念一想,为什么4.x可以而5.x不行?网上查找资料什么tokenstore也没有,转换器也没有找到。已经两天了,刚准备放弃,忽然想到不如对比一下日志和两种版本的源代码。结果令人惊喜,我分别用两种版本的注册中心来管理uaa,在切换api docs的时候清空日志观察,将线索定位在了service包下面的ZuulUpdaterService类,比较行数发现差一行,而这一行是在5.x这一版里面多import来一个类import java.util.Collections;追踪查找,在两个版本此类的61行上下,构建一个ZuulRouteDTO对象时,找到了不同之处;

4.x

ZuulRouteDTO route = new ZuulRouteDTO(instanceId, "/" +
                    application.getName().toLowerCase() + "/" + instanceId + "/**",
                    null, url, zuulProperties.isStripPrefix(), zuulProperties.getRetryable(), null,
                    instanceInfos.getStatus().toString());

5.x

ZuulRouteDTO route = new ZuulRouteDTO(instanceId, "/" +
                    application.getName().toLowerCase() + "/" + instanceId + "/**",
                    null, url, zuulProperties.isStripPrefix(), zuulProperties.getRetryable(), Collections.emptySet(),
                    instanceInfos.getStatus().toString());

差别就在于倒数第二个参数sensitiveHeaders。也不知道新版中这里构建一个空的Set到底有什么用,但是很明显,这样构建在json中的结构是不一样的,一个被当作对象来解析,一个会被当作数组来解析,如果解析方式没有变化,就会出现json转换失败。详细缘由没有深究,把此处改过来。重新部署测试,一切正常!

不过查看,ZuulRouteDTO的相关构造方法,发现新版中sensitiveHeaders这个参数被标记了@NotNull,虽然测试没有发现问题,但是不知道在后续的使用过程会不会有问题,需要关注这个问题。

发布了106 篇原创文章 · 获赞 46 · 访问量 29万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章