spring-cloud/spring-cloud-gateway

Unable to access application context in discovery

Open

#2 734 ouverte le 26 sept. 2022

Voir sur GitHub
 (2 commentaires) (0 réactions) (0 assignés)Java (3 204 forks)batch import
enhancementhelp wanted

Métriques du dépôt

Stars
 (4 284 stars)
Métriques de merge PR
 (Merge moyen 1j 21h) (18 PRs mergées en 30 j)

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.

Guide contributeur