:(参数名称中的冒号经过zuul。也许与春天有关

时间:2016-07-17 12:05:26

标签: spring spring-boot netflix-zuul

当传入一个名为?name:content=john的参数的url时,我收到以下错误(请参阅下面的stacktrace)。

当它调用org.springframework.web.util.HierarchicalUriComponents方法时,将其缩小到expandQueryParams

然后调用getVariableName并返回此案例名称,因为它已删除尾随:content

我确信这是有原因的,但无论如何我可以阻止它发生,因为它在以后找不到名称参数,如下面的堆栈跟踪所示。

对此的任何帮助都将受到非常感谢。这是让Zuul为我们带来生活的最后障碍。

java.lang.IllegalArgumentException: Map has no value for 'name'
at org.springframework.web.util.UriComponents$MapTemplateVariables.getValue(UriComponents.java:306) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:230) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.util.HierarchicalUriComponents.expandQueryParams(HierarchicalUriComponents.java:343) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:329) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:47) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.util.UriComponents.expand(UriComponents.java:152) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.util.UriTemplate.expand(UriTemplate.java:97) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper.getQueryString(ProxyRequestHelper.java:274)

1 个答案:

答案 0 :(得分:0)

此处的错误位于ProxyRequestHelper的第264和266行:

  singles.put(param + i, value);
  query.append("={");
  query.append(param + i);

由于param包含冒号,因此在后续扩展中将其解释为UriTemplate

一种解决方案是使用在解析处理UriTemplate时不会被解释的字符替换冒号,这不会导致与另一个查询参数的冲突。例如,如果我们将:替换为!,则原始查询字符串中可能会出现name:content=johnname!content=jane。为避免此问题,我们可以先将!替换为!!,然后将:的所有实例替换为!

此处引发的错误https://github.com/spring-cloud/spring-cloud-netflix/issues/1193