spring-cloud/spring-cloud-gateway

Unable to access application context in discovery

Aberta

#2.734 aberto em 26 de set. de 2022

 (2 comentários) (0 reação) (0 responsável)Java (3.204 forks)batch import
enhancementhelp wanted

Métricas do repositório

Stars
 (4.284 estrelas)
Métricas de merge de PR
 (Mesclagem média 1d 21h) (18 fundiu PRs em 30d)

Description

Describe the bug Though I fixed the documentation in https://github.com/spring-cloud/spring-cloud-gateway/pull/2733 I am still unable to use the rate limiter in Discovery. It appears that in the code you're assembling a new evaluation context containing only the metadata and not include the rest of the context so defining a keyresolver does not work inside discovery

In DiscoveryClientRouteDefinitionLocator specifically

	private DiscoveryClientRouteDefinitionLocator(String discoveryClientName, DiscoveryLocatorProperties properties) {
		this.properties = properties;
		if (StringUtils.hasText(properties.getRouteIdPrefix())) {
			routeIdPrefix = properties.getRouteIdPrefix();
		}
		else {
			routeIdPrefix = discoveryClientName + "_";
		}
               // context is built here
		evalCtxt = SimpleEvaluationContext.forReadOnlyDataBinding().withInstanceMethods().build();
	}

// and only gets the info from the service instance.

	String getValueFromExpr(SimpleEvaluationContext evalCtxt, SpelExpressionParser parser, ServiceInstance instance,
			Map.Entry<String, String> entry) {
		try {
			Expression valueExpr = parser.parseExpression(entry.getValue());
			return valueExpr.getValue(evalCtxt, instance, String.class);
		}
		catch (ParseException | EvaluationException e) {
			if (log.isDebugEnabled()) {
				log.debug("Unable to parse " + entry.getValue(), e);
			}
			throw e;
		}
	}

Sample If possible, please provide a test case or sample application that reproduces the problem. This makes it much easier for us to diagnose the problem and to verify that we have fixed it.

Guia do colaborador