[Daily Fresh Mushroom] Ненормально`Недостаточно значений переменных для расширения ‘телефон’`

Микросервисы
[Daily Fresh Mushroom] Ненормально`Недостаточно значений переменных для расширения ‘телефон’`

Это очень распространенное исключение недопустимого параметра.

сообщение об ошибке

java.lang.IllegalArgumentException: Not enough variable values available to expand 'phone'
        at org.springframework.web.util.UriComponents$VarArgsTemplateVariables.getValue(UriComponents.java:367)
        at org.springframework.web.util.HierarchicalUriComponents$QueryUriTemplateVariables.getValue(HierarchicalUriComponents.java:1055)
        at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:262)
        at org.springframework.web.util.HierarchicalUriComponents.lambda$expandQueryParams$5(HierarchicalUriComponents.java:443)
        at java.util.Map.forEach(Map.java:630)
        at org.springframework.web.util.HierarchicalUriComponents.expandQueryParams(HierarchicalUriComponents.java:439)
        at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:429)
        at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:51)
        at org.springframework.web.util.UriComponents.expand(UriComponents.java:172)
        at org.springframework.web.util.DefaultUriBuilderFactory$DefaultUriBuilder.build(DefaultUriBuilderFactory.java:376)
        at org.springframework.web.util.DefaultUriBuilderFactory.expand(DefaultUriBuilderFactory.java:202)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:669)
        at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:414)

Разобрать

Это вопрос-заполнитель.

RestTemplateсуществует в запрошенном URL{phone}Это значение заменяется соответствующим значением в параметре по умолчанию.

Разбор специальных значений, присутствующих в URL

регулярное выражение"\\{([^/]+?)\\}"ударил{phone}, затем программа возвращается к поискуphoneсделать замену.

    private static final Pattern NAMES_PATTERN = Pattern.compile("\\{([^/]+?)\\}");

    @Nullable
    static String expandUriComponent(@Nullable String source, UriTemplateVariables uriVariables,
            @Nullable UnaryOperator<String> encoder) {

        if (source == null) {
            return null;
        }
        if (source.indexOf('{') == -1) {
            return source;
        }
        if (source.indexOf(':') != -1) {
            source = sanitizeSource(source);
        }
        Matcher matcher = NAMES_PATTERN.matcher(source);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String match = matcher.group(1);
            String varName = getVariableName(match);
            Object varValue = uriVariables.getValue(varName);
            if (UriTemplateVariables.SKIP_VALUE.equals(varValue)) {
                continue;
            }
            String formatted = getVariableValueAsString(varValue);
            formatted = encoder != null ? encoder.apply(formatted) : Matcher.quoteReplacement(formatted);
            matcher.appendReplacement(sb, formatted);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

получить значение из uriVariables

Если телефон не найден, будет предложено исключениеIllegalArgumentException

    /**
     * URI template variables backed by a variable argument array.
     */
    private static class VarArgsTemplateVariables implements UriTemplateVariables {

        private final Iterator<Object> valueIterator;

        public VarArgsTemplateVariables(Object... uriVariableValues) {
            this.valueIterator = Arrays.asList(uriVariableValues).iterator();
        }

        @Override
        @Nullable
        public Object getValue(@Nullable String name) {
            if (!this.valueIterator.hasNext()) {
                throw new IllegalArgumentException("Not enough variable values available to expand '" + name + "'");
            }
            return this.valueIterator.next();
        }
    }

решать

Мы бросаем исключение здесь, потому что некоторые из номеров мобильных телефонов пользователя в исторических данных установлены на138${phone}Это значение не проверяется на достоверность при записи.

Суммировать

URLпоставить фигурные скобки{}Содержимое используется в качестве заполнителя, а значение, соответствующее заполнителю, не передается, что приводит к ошибке.